1

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

4

3 回答 3

2

这可能是一个愚蠢的问题,但是 column1 是否已编入索引?

想想第二个问题,如果数据库需要对整个数据集进行排序以确定要返回的正确 1000 个元素,这将是有意义的:)

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

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

你想选择5个数字,升序。如果你只取前 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 的所有行,因此您正在处理较小的数据集。

于 2012-10-23T10:02:20.660 回答
2

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

于 2012-10-23T10:16:54.140 回答
0

尝试:

Select * from my_table where primary_key in
(SELECT primary_key FROM my_table LIMIT 9000,10000)
ORDER BY column1 ASC;
于 2012-10-23T10:06:38.133 回答