一般分頁這樣寫
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倍。