優化limit分頁

2022-08-16 13:30:17 字數 960 閱讀 7058

問題:

訂單資料大約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...