mysql分页优化

一般分页这样写

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倍。

posted @ 2018-08-01 14:30  点点阳光  阅读(395)  评论(0编辑  收藏  举报