MySQL使用limit条件时要注意offset不能太大

MySQL使用limit条件时要注意offset不能太大。

这样还可以:

select * from user order by user_name limit 100, 20

这样就不好了:

select * from user order by user_name limit 10000, 20

这条语句实际上是把 1-10020行都取出来,然后再丢掉前10000条记录,最后再返回剩下的20条记录。所以代价会非常高。

如果数据库是innodb且user_name上有索引的话,可以把sql改写成这样来优化一下:

select * from user 
       join
         (select id from user order by user_name limit 10000,20) as lim
       on user.id = lim.id

这里仍然会扫描1万多次,但扫描的不是data rows, 而是user_name上的index(并且是covering index) ; 扫完索引之后,再根据扫出的id把20行数据取出来。也就是说,磁盘读会小很多,速度也会快很多。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.