Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询执行时间过长_Mysql_Sql - Fatal编程技术网

Mysql SQL查询执行时间过长

Mysql SQL查询执行时间过长,mysql,sql,Mysql,Sql,我有两张桌子。表1(问题)有两列“qid”(问题id)和“问题”。表2(答案)有“aid”(答案id)、“qid”和“答案”。表2中的“qid”是表1中的外键,单个问题可能有多个答案 两个表都有30000多个条目 我做了一个循环 for(each qid) { select question from table1 where qid = id; select answer from table2 where qid = id; } 传递的ID数为10(到循环)。执行查询大约需要18秒。 这么

我有两张桌子。表1(问题)有两列“qid”(问题id)和“问题”。表2(答案)有“aid”(答案id)、“qid”和“答案”。表2中的“qid”是表1中的外键,单个问题可能有多个答案

两个表都有30000多个条目

我做了一个循环

for(each qid)
{
select question from table1 where qid = id;
select answer from table2 where qid = id;
}
传递的ID数为10(到循环)。执行查询大约需要18秒。
这么多的延迟是正常的还是这种方法有问题。我想知道是否有任何方法可以使上述查询更快。

您可以在单个查询中完成,这应该会快得多

SELECT t1.qid, t1.question, t2.aid, t2.answer
FROM table1 t1
INNER JOIN table2 t2 ON t2.qid = t1.qid
WHERE t1.qid IN (?,?,?,etc.);
或者你可以

SELECT t1.qid, t1.question, t2.aid, t2.answer FROM table1 t1, table2 t2 WHERE t1.qid=t2.qid AND t1.qid IN(...some condition...);

我完全同意@wvdz

此外,这是一个通用列表,列出了您可以执行哪些操作来提高选择的性能:

  • 分析并可能重写您的查询(这里还有很多未说的,所以我建议访问我包含的一个资源链接,或者两者都访问)
  • 如果查询包含有效的主键,请确保 实际上,您已经为该列创建了主键约束 (这将创建一个索引)
  • 考虑为将在中使用的任何列创建索引 查询的条件(与第一点类似,如果您认为需要更多的优化,您将希望了解这一点,表中的数据越多,这一点就越重要)
  • 此外,这里还有一些用于调优sql查询的好资源:


    关于主键的注意事项:如果您想了解更多关于主键使用的信息,我在过去给出的这个答案解释了我如何使用主键以及为什么。。。提到这一点是因为,根据我的观点和经验,每个表都应该包含一个主键:

    当然,20年前=)这种连接表的方式已经过时了。您为表编制索引了吗?