为什么MySQL需要更多时间才能获得以更高数字开头的记录?

时间:2012-11-09 19:44:17

标签: mysql sql database

  

可能重复:
  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列过滤器。

1 个答案:

答案 0 :(得分:1)

是的,这是真的,随着偏移值的增加,时间会增加,原因是因为偏移对表中没有索引的行的物理位置有效。因此,要在偏移量x处找到一行,数据库引擎必须遍历从0到x的所有行。