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 * fromabc
wherebatchid
= 123 limit 839960, 40
反向查詢sql:
sql**
select * fromabc
wherebatchid
= 123 order by inputdate desc limit 788775, 40
第30000
正向查詢sql:
sql**
select * fromabc
wherebatchid
= 123 limit 1199960, 40
反向查詢sql:
sql**
select * fromabc
wherebatchid
= 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...