我们正在努力使此查询在可容忍的时间内运行:
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秒(我们的测试环境中允许的最大值)后超时。
LIMIT
我们需要能够在10秒钟或更短的时间内返回查询的所有结果。有时,这大约是10,000条记录。这是不现实的吗?还是我们做的不是最理想的事情,这使得查询变得如此缓慢。
如果相关,当我从命令行(而不是通过我的PHP应用程序)运行此查询时,即使返回10K记录,它也非常快。
更新:EXPLAIN显示索引未用于已连接的表之一
EXPLAIN
您JOIN和的WHERE子句非常混乱,就像我上面的评论中提到的问题一样。
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