为什么MYSQL的LIMIT偏移会减慢查询速度?

场景简介:具有超过1600万条记录的表(大小为2GB)。使用SELECT时,LIMIT偏移量越高,查询变得越慢,使用ORDER BY * primary_key *

所以

SELECT * FROM large ORDER BY `id`  LIMIT 0, 30 

远远小于

SELECT * FROM large ORDER BY `id` LIMIT 10000, 30 

这只订单30记录和同样的。所以这不是ORDER BY的开销。
现在,当获取最近的30行时,它需要大约180秒。如何优化这个简单的查询?

正常情况下,较高的偏移会减慢查询速度,因为查询需要对第一个OFFSET LIMIT条记录进行计数(而且只接受它们的LIMIT条)。此值越高,查询运行的时间越长。

查询不能直接到OFFSET,因为,首先,记录可以具有不同的长度,并且,其次,可以存在从被删除的记录的间隙。它需要检查和计数每个记录的方式。

假设id是MyISAM表的PRIMARY KEY,你可以使用这个技巧加快它:

SELECT  t.*
FROM    (
        SELECT  id
        FROM    mytable
        ORDER BY
                id
        LIMIT 10000, 30
        ) q
JOIN    mytable t
ON      t.id = q.id

查看这篇文章:

> MySQL ORDER BY / LIMIT performance: late row lookups

http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么MYSQL的LIMIT偏移会减慢查询速度?