我们正在努力让这个查询在足够长的时间内运行:
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
表示索引未被用于其中一个连接表
答案 0 :(得分:2)
您的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
答案 1 :(得分:0)
即使您有良好的指数,也应该避免使用以下标准:
`Attempt`.`test_id` != 875
`Attempt`.`score` > 10
并用IN()或类似的东西替换它们
`Attempt`.`test_id` = 964