优化分页limit
通常我们在分页的时候,通常使用的是limit 50, 10这种语句。数据少还不错,但是当数据偏移量非常大的时候,性能就会出现问题,例如select xx,xxx from test_table limit 100000020, 20。扫描了100000020条数据,才返回20条数据。
这个时候我们可以用一下两种方式来优化:
- 利用between and和主键索引
利用主键自增id,我们如果知道了分页的上边界,以上查询可以改写为:
select xxx, xxx from test_table where id between xxxxx and xxxx。
- 利用自增主键索引、order by加limit,不使用offset
limit和offset的问题,其实就是offset的问题,它会导致MySQL扫描大量不需要的行然后再抛弃掉。如果使用某个标签记录上一次所取数据的位置,那么下次就可以直接从书签位置开始扫描,这样就可以避免使用offset。
例如以上查询可以改为:
第一组数据:``select xxx, xxxx from test_table order by id desc limit 20;
这样就拿到了本次数据和下次数据的分解id值,则下一页查询就知道可以:
select xxx, xxx from test_table where id < '上页id分界值' order by id desc limit 20
(完)