mysql分頁limit 優化

2021-06-27 02:27:03 字數 3902 閱讀 8203

mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset和length比較大的時候,mysql明顯效能下降

* 1.子查詢優化法

先找出第一條資料,然後大於等於這條資料的id就是要獲取的數

缺點:資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性

實驗下sql**

mysql> set profiling=1

query ok, 0 rows affected (0.00 sec

3.4. mysql> select count(*) from member

+———-

| count(*)

+———-

|   169566

+———-

1 row in set (0.00 sec

11.12. mysql> pager grep !~

pager set to 『grep !~-

14.15. mysql> select * from member limit 10, 100

100 rows in set (0.00 sec

17.18. mysql> select * from member where memberid >= (select memberid from member limit 10,1) limit 100

100 rows in set (0.00 sec

20.21. mysql> select * from member limit 1000, 100

100 rows in set (0.01 sec

23.24. mysql> select * from member where memberid >= (select memberid from member limit 1000,1) limit 100

100 rows in set (0.00 sec

26.27. mysql> select * from member limit 100000, 100

100 rows in set (0.10 sec

29.30. mysql> select * from member where memberid >= (select memberid from member limit 100000,1) limit 100

100 rows in set (0.02 sec

32.33. mysql> nopage

pager set to stdou

35.36.37. mysql> show profiles\

************************ 1. row  ***********************

query_id:

duration: 0.0000330

query: select count(*) from membe

42.43. ************************ 2. row  ***********************

query_id:

duration: 0.0016700

query: select * from member limit 10, 10

************************ 3. row  ***********************

query_id:

duration: 0.0011240

query: select * from member where memberid >= (select memberid from member limit 10,1) limit 10

51.52. ************************ 4. row  ***********************

query_id:

duration: 0.0026320

query: select * from member limit 1000, 10

************************ 5. row  ***********************

query_id:

duration: 0.0013400

query: select * from member where memberid >= (select memberid from member limit 1000,1) limit 10

60.61. ************************ 6. row  ***********************

query_id:

duration: 0.0995670

query: select * from member limit 100000, 10

************************ 7. row  ***********************

query_id:

duration: 0.0244770

query: select * from member where memberid >= (select memberid from member limit 100000,1) limit 100

從結果中可以得知,當偏移1000以上使用子查詢法可以有效的提高效能。

* 2.倒排表優化法

倒排表法類似建立索引,用一張表來維護頁數,然後通過高效的連線得到資料

缺點:只適合資料數固定的情況,資料不能刪除,維護頁表困難

具體請看, 

* 3.反向查詢優化法

當偏移超過一半記錄數的時候,先用排序,這樣偏移就反轉了

缺點:order by優化比較麻煩,要增加索引,索引影響資料的修改效率,並且要知道總記錄

,偏移大於資料的一

引limit偏移演算法

正向查詢: (當前頁 – 1) * 頁長

反向查詢: 總記錄 – 當前頁 * 頁長

做下實驗,看看效能如何

總記錄數:1,628,77

每頁記錄數: 4

總頁數:1,628,775 / 40 = 4072

中間頁數:40720 / 2 = 20360

第21000

正向查詢sql:

sql**

select * fromabcwherebatchid= 123 limit 839960, 40

反向查詢sql:

sql**

select * fromabcwherebatchid= 123 order by inputdate desc limit 788775, 40

第30000

正向查詢sql:

sql**

select * fromabcwherebatchid= 123 limit 1199960, 40

反向查詢sql:

sql**

select * fromabcwherebatchid= 123 order by inputdate desc limit 428775, 40

注意,反向查詢的結果是是降序desc的,並且inputdate是記錄的插入時間,也可以用主鍵聯合索引,但是不方便。

* 4.limit限制優化法

把limit偏移量限制低於某個數。。超過這個數等於沒資料,我記得alibaba的dba說過他們是這樣做的

* 5.只查索引法

總結:limit的優化限制都比較多,所以實際情況用或者不用只能具體情況具體分析了。頁數那麼後,基本很少人看的。。。

python呼叫mysql儲存過程並獲取返回值

python操作mysql資料庫的例子

python mysqldb的安裝和使用

MySql分頁limit 優化

mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset比較大的時候,mysql明顯效能下降 1.子查詢優化法 mysql set profiling 1 query ok,0 rows affected 0.00 sec mysql select ...

MySql分頁limit優化

mysql使用limit分頁,當limit offset,rows的offset數值過大時,會出現效率問題。正常查詢 查詢三次,時間分別是0.684s,0.901s,0.708s.執行計畫,走的range索引。查詢三次,耗時分別為0.151s,0.401s,0.211s。為什麼這樣寫可以提高效率?s...

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...