简而言之,场景:一个拥有超过1600万条记录[2GB大小]的表。当使用ORDER BY * primary_key *时,SELECT的LIMIT偏移量越高,查询速度就越慢
所以
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 + LIMIT
LIMIT
查询无法直接进行,OFFSET因为,第一,记录的长度可能不同,第二,删除的记录可能会有间隙。它需要检查并计数其途中的每条记录。
OFFSET
假设id是PRIMARY KEY一个的MyISAM表,你可以使用这一招加快步伐:
id
PRIMARY KEY
MyISAM
SELECT t.* FROM ( SELECT id FROM mytable ORDER BY id LIMIT 10000, 30 ) q JOIN mytable t ON t.id = q.id
看到这篇文章: