問題:
訂單資料大約90萬+,每頁展示20條記錄,當直接點選尾頁時,呼叫服務超時;
sql如下:select * from t_order_salary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,20;
limit 900000,20;,mysql需要查詢前900020條記錄然後返回最後20條,前面900000條記錄將被拋棄,
一言以蔽之,就是越往後分頁, limit 語句的偏移量就會越大,速度也會明顯變慢。
優化方案:
1、join 分頁方式
使用覆蓋索引,延遲關聯大大提公升查詢效率
select a.* from t_order_salary a
join (
select id from t_ordersalary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,20
) b on a.id =b.id;
2、子查詢方式
select * from t_order_salary
where create_time<(
select create_time from t_order_salary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,1
) limit 20;
為什麼會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在資料檔案上完成的,通常來說,索引檔案要比資料檔案小得多,所以操作起來也會更有效率。
3、折半+反序查詢
當查詢的頁數超過資料的一半的時候,將資料倒序,再查詢,這樣有可能造成一定的誤差;
4、當更改sql仍然滿足不了的情況,可以考慮使用分庫分表+es
其他:
limit分頁優化
對於有大資料量的mysql表來說,使用limit分頁存在很嚴重的效能問題。查詢從第1000000之後的30條記錄 sql 1 平均用時6.6秒 select from cdb posts order by pid limit 1000000 30 sql 2 平均用時0.6秒 select from...
Limit分頁優化
1.直接用limit start,count分頁語句,也是我程式中用的方法 select from product limit start,count 當起始頁較小時,查詢沒有效能問題,我們分別看下從10,100,1000,10000開始分頁的執行時間 每頁取20條 如下 select from p...
LIMIT分頁優化
在系統中需要分頁的操作通常會使用limit加上偏移量的方法實現,同時加上合適的order by 子句。如果有對應的索引,通常效率會不錯,否則mysql需要做大量的檔案排序操作。乙個非常令人頭疼問題就是當偏移量非常大的時候,例如可能是limit 10000,20這樣的查詢,這是mysql需要查詢100...