2013-02-19 31 views
1

我正在基于php和mysql创建一个MCQ测验。这里是我的主表的结构:MCQ测验加载速度慢并且随机化不起作用

测验表:测验ID,quiz_category 类别表:ID,标题... 问题表:ID,测验ID,类别ID,标题...... 答案表:ID ,问题ID ...

要开始的事情,我有表填充150 +测验,4类,14000 +问题和rightanswers每个。

为了节省时间,对于每个问题,正确的答案是从答案表https://stackoverflow.com/editing-helpalongwith 3其他随机答案中提取。

现在,当我用两次测验测试它时,它工作正常。但随着150次测验,一些问题也出现了:

  • 数据库是缓慢和更高测验需要永远载入问题
  • 答案的随机不工作了 - 用正确的答案一起,其他选项显示相同的条目,使用户可以轻松猜出正确的答案。

你可以在我以前的Stackoverflow查询中看到我正在使用的代码。 https://stackoverflow.com/questions/14826573/randomising-questions-and-answers-php-quiz-not-working

关于测验计划的理想查询应该如何工作的任何想法?

+0

你有没有做过一些分析,以确定性能差是否与数据库(查询等)或应用程序逻辑(循环等)有关? – Steve 2013-02-19 13:34:03

+0

看看你的计划和索引也将有所帮助 – Steve 2013-02-19 13:34:55

+0

嗨史蒂夫,我是新的PHP编程。你想让我发布表格的结构吗?另外,我在我之前的文章中发布了查询数据库的代码。 HTTP://计算器。com/questions/14826573/randomising-questions-and-answers-php-quiz-not-working – user1589406 2013-02-19 13:47:15

回答

0

我将提供一些关于如何提高性能的提示,但这些将是通用的,可能并不完整。

从简要的看你的PHP和SQL语句from your previous question,有一些索引的逻辑位置。要添加一个索引请冷藏到MySQL manual了解更多信息

$sql4="select * from answers where question_id=".$row2['id']; 

question_id应该有一个指标

$sql2="select * from questions where quiz_id=".$_SESSION['quizid']; 

quiz_id应该有一个指标

添加这两个指标也将改善这种选择性

$sql3="select * from answers where question_id in (select id from 
questions where quiz_id =$row2[quiz_id]) order by rand()"; 

这将有助于像以前一样,您将对每个查询执行全表扫描。

你的另一个问题是你有一个循环,并且在你发送命令来查询数据库的每个迭代中,你应该在循环前一次收集所有信息,然后迭代使用它,而不是每次迭代发送单个查询。

+0

我想添加一条评论,但它与我的回答没有关系。我强烈建议你学习索引,并加入MySQL。分析您的应用程序和数据库将有助于确定性能问题以及根本原因。 – Steve 2013-02-20 09:50:17

+1

Steve,感谢您的数据库提示。我正在努力学习关于该主题的所有知识,因为编写测验的人不再可以修复它。所以,我有一个50000+的问题和答案的数据库,但没有代码来运行它。 :-)所以,我非常感谢你的提示。再次感谢你。 – user1589406 2013-02-21 13:14:01

+0

@ user1589406用我提供的链接添加索引将有很大帮助。改变循环也将有所帮助。如果这是正确的答案,您可以将其标记为帮助其他用户。我可以强烈推荐由Baron Schwartz,Peter Zaitsev和Vadim Tkachenko撰写的“高性能MySQL”一书 – Steve 2013-02-21 13:37:55