简而言之,此查询返回890738个条目
SELECT *
FROM `cms_question_report`
WHERE `doa` < '2014-12-16 11:48:13'
它在大约2秒内完成了
尝试将其剪切为4个块后,此查询超时并产生错误
SELECT *
FROM `cms_question_report`
WHERE `doa` < '2014-12-16 11:48:13'
LIMIT 222684
这是错误:
Error in Processing Request
Error code: 500
Error text: Internal Server Error
在我的基本理解中,第二个运行速度不应该更快,因为它对获取的数据有一个下限?
另一项测试:
SELECT *
FROM `cms_question_report`
WHERE `doa` < '2014-12-16 11:48:13'
LIMIT 2
这很顺利
答案 0 :(得分:0)
不,它不会跑得更快。数据库必须先获取所有结果并在应用LIMIT之前对它们进行排序。我知道这似乎是浪费资源,为什么不在获得LIMIT行后停止?因为它们必须被排序,即使该顺序是隐含的,因为您没有指定明确的顺序。隐式顺序是查询中主表的PK顺序,但WHERE子句意味着不会按顺序自动找到行。因此,必须找到所有行,然后排序,然后限制。
答案 1 :(得分:0)
感谢Roy Shmuli找到解决方案。解决问题的查询是:
SELECT Y.* FROM (SELECT id FROM `cms_question_report` WHERE doa < '2014-12-16 11:48:13' ORDER BY id LIMIT 295354) X JOIN `cms_question_report` Y ON X.id = Y.id
我从这个链接得到了它: http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/