1

我正在创建一个基于 php 和 mysql 的 MCQ 测验。以下是我的主表的结构:

quiz 表:quiz id、quiz_category 类别表:id、title... 问题表:id、quiz id、categoryid、title... 答案表:id、question id...

首先,我在表格中填充了 150 多个测验、4 个类别、14000 多个问题和每个问题的正确答案。

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

现在,当我只用两个测验对其进行测试时,它运行良好。但是在 150 次测验中,出现了几个问题:

  • 数据库很慢,以后的测验需要永远加载问题
  • 答案的随机化不再起作用 - 与正确答案一起,其他选项显示相同的条目,使用户可以轻松猜测正确答案。

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

知道测验程序的理想查询应该是什么吗?

4

1 回答 1

0

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

从上一个问题中简要查看您的 PHP 和 SQL 语句,索引有几个合乎逻辑的位置。要添加索引,请参阅MySQL 手册以获取更多信息

$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()";

这将有助于您之前对每个查询执行全表扫描。

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

于 2013-02-20T09:47:56.757 回答