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行数据取出来。也就是说,磁盘读会小很多,速度也会快很多。