繁体   English   中英

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

[英]How to make query with ORDER BY and LIMIT work faster?

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

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

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

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

并且考虑第二个问题,如果数据库需要对整个数据集进行排序以确定要返回的正确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的所有行,因此您正在处理较小的数据集。

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

尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM