可能重复:
How can I speed up a MySQL query with a large offset in the LIMIT clause?
在我们的应用程序中,我们在网页上显示来自MySQL的记录。像在大多数此类应用程序中一样,我们使所以查询看起来像这样:
select * from sms_message
where account_group_name = 'scott'
and received_on > '2012-10-11' and
received_on < '2012-11-30'
order by received_on desc
limit 200 offset 3000000;
此查询需要104秒。如果我只将偏移量改为低值或将其完全删除,则只需半秒钟。那是为什么?
只有一个复合索引,它是account_group_name,received_on和另外两列。表是InnoDB。
更新:
解释回报:
1 SIMPLE sms_message ref all_filters_index all_filters_index 258 const 2190030 Using where
all_filters_index是上面提到的4列过滤器。
答案 0 :(得分:1)
是的,这是真的,随着偏移值的增加,时间会增加,原因是因为偏移对表中没有索引的行的物理位置有效。因此,要在偏移量x处找到一行,数据库引擎必须遍历从0到x的所有行。