在我的项目中,我有一个运行相同查询但具有不同限制值的循环。在前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寄存器进行排序。但是,我怎样才能在指定范围之间进行分类? 如何使此查询更快地运行?
答案 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;