mysql中的限制是超时的

时间:2015-03-17 03:36:45

标签: mysql

简而言之,此查询返回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

这很顺利

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/