为什么这个MySQL查询这么慢?

时间:2013-12-02 16:39:34

标签: mysql sql join

我们正在努力让这个查询在足够长的时间内运行:

SELECT `User`.`id`,
FROM `users` AS `User` 
LEFT JOIN `attempts` AS `Attempt` ON (`Attempt`.`user_id` = `User`.`id` AND `Attempt`.`test_id` != 875) 
LEFT JOIN `resumes` AS `Resume` ON (`Resume`.`user_id` = `User`.`id`) 
WHERE `Attempt`.`test_id` = 964 AND `Attempt`.`score` > 10 AND `Resume`.`has_file` = 1 AND `Resume`.`user_id` = `User`.`id` 

总共有大约50,000个用户行。

LIMIT为1000或更低时,查询几乎是即时的。但是如果没有限制,它会在300秒后超时(我们的测试环境允许的最大值)。

我们需要能够在10秒或更短的时间内从查询中返回所有结果。有时这将是大约10,000条记录。这是不现实的吗?或者我们正在做一些次优的事情,这使得这个查询变得如此缓慢。

如果它是相关的,当我从命令行(而不是通过我的PHP应用程序)运行此查询时,即使返回10K记录,它也非常快。

*更新:* EXPLAIN表示索引未被用于其中一个连接表

2 个答案:

答案 0 :(得分:2)

您的JOINWHERE条款非常混乱,就像上面评论中提到的问题一样。

试试这个:

SELECT `User`.`id`
FROM `users` AS `User` 
INNER JOIN `attempts` AS `Attempt` ON `Attempt`.`user_id` = `User`.`id` 
INNER JOIN `resumes` AS `Resume` ON `Resume`.`user_id` = `User`.`id`
WHERE `Attempt`.`test_id` = 964 
    AND `Attempt`.`score` > 10 
    AND `Resume`.`has_file` = 1 

答案 1 :(得分:0)

即使您有良好的指数,也应该避免使用以下标准:

`Attempt`.`test_id` != 875
`Attempt`.`score` > 10

并用IN()或类似的东西替换它们

`Attempt`.`test_id` = 964