通常我們的分頁分頁查詢時這樣的:
select * from table_name limit m,n;
當表的數據很大(幾百萬或更多)時,分頁查詢會隨m的值變大而時間邊長:
select * from bd_user limit 10000, 20; #耗時0.003秒 select * from bd_user limit 100000, 20; #耗時0.024秒 select * from bd_user limit 1000000, 20; #耗時0.25秒 select * from bd_user limit 3000000, 20; #耗時0.785秒
針對這種問題,我們優化思路如下:
- 利用索引列或主鍵索引做order by 排序
- 記住上次查找結果的主鍵,盡量給出查找范圍
- 利用覆蓋索引和主鍵索引
所以我們的SQL語句就變成了這樣:
select * from bd_user where id>=3000000 order by id limit 0, 20; #耗時0.001秒 select * from bd_user where id>=(select id from bd_user order by id limit 3000000, 1) order by id limit 0, 20; #耗時0.413秒 select a.* from bd_user a inner join (select id from bd_user order by id limit 3000000, 20) b on a.id=b.id order by id; #耗時0.397秒
我們發現,第一條SQL簡直要起飛,第二、三條執行效率也提升了一倍。