如何使ORDER BY和LIMIT查询工作更快?

时间:2012-10-23 10:00:17

标签: mysql

在我的项目中,我有一个运行相同查询但具有不同限制值的循环。在前10个循环周期中,以可接受的速度执行查询,但随后减慢速度。我正在查询的表有150K寄存器,column1是整数,我的查询是:

SELECT * FROM my_table ORDER BY column1 ASC LIMIT 0,1000
...
SELECT * FROM my_table ORDER BY column1 ASC LIMIT 9000,10000

据我了解,每次都会对所有150K寄存器进行排序。但是,我怎样才能在指定范围之间进行分类? 如何使此查询更快地运行?

3 个答案:

答案 0 :(得分:2)

这可能是一个愚蠢的问题,但是第一列索引了吗?

考虑第二个问题,如果数据库需要对整个数据集进行排序以确定要返回的正确1000个元素,那么它将会发生:)

想象一下,你有10个任意顺序的数字

4, 7, 1, 3, 9, 8, 5, 2, 6, 0

并且您想要选择5个数字,升序。如果您只是拿前五个,然后对它们进行排序,那么

1,3,4,7,9

如果您先对整个列表进行排序,然后取5,那么

0,1,2,3,4

编辑:由于它是PK,我不知道LIMIT是否足够聪明以确定您的主键是否是顺序的,否则它肯定需要先读取它们。 EXPLAIN会告诉你它是不是。

基于评论的编辑

如果它是顺序的,也许这样的事情会有所帮助

SELECT * FROM ... WHERE column1 >= 9000 ORDER BY column1 ASC LIMIT 1000

where将确保它忽略column1值低于9000的所有行,因此您正在处理较小的数据集。

答案 1 :(得分:2)

此博客列出了您可以采取的加速分页查询的所有选项: http://www.xarg.org/2011/10/optimized-pagination-using-mysql/

答案 2 :(得分:0)

尝试:

Select * from my_table where primary_key in
(SELECT primary_key FROM my_table LIMIT 9000,10000)
ORDER BY column1 ASC;