一般分页这样写
select * from goods limit 50,20
从50行开始取20行,即第51行到70行
当数据量少当时候这样并没有什么问题,但是如果
select * from goods limit 1000000,20
查询耗时骤升。
这种方式是查询出1000000+20行,再取20行,前面1000000行丢弃。
如何优化?
1.延迟关联
select * from goods inner join (select id from goods order by id limit 1000000,20) as lim using(id)
这里使用了覆盖索引
覆盖索引:如果一个索引包含(或者说覆盖)所有需要查询字段的值,称之为“覆盖索引”
2.使用between and
select * from goods where id between 1000000 and 1000020 order by id
3.优化offset
limit offset 的问题其实是offset的问题,可以根据上次记录的位置开始扫描,避免使用offset
select * from goods where id<1000020 order by id desc limit 20
这种方法好处是无论翻多少页,性能都很好。
性能比较
优化offset >= between and > 延迟关联 > limit offset
延迟关联(2-3倍)于limit offset。
优化offset , between and(多倍)于limit offset,如果使用了索引将近100倍。