一尘不染

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

sql

我们正在努力使此查询在可容忍的时间内运行:

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个用户行。

当aLIMIT等于或小于1000时,查询几乎是瞬时的。但是,如果不存在限制,它将在300秒(我们的测试环境中允许的最大值)后超时。

我们需要能够在10秒钟或更短的时间内返回查询的所有结果。有时,这大约是10,000条记录。这是不现实的吗?还是我们做的不是最理想的事情,这使得查询变得如此缓慢。

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

更新:EXPLAIN显示索引未用于已连接的表之一


阅读 177

收藏
2021-05-16

共1个答案

一尘不染

JOIN和的WHERE子句非常混乱,就像我上面的评论中提到的问题一样。

试试这个:

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
2021-05-16