標籤:des blog http io ar 使用 sp 資料 div
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.倒排表最佳化法
倒排表法類似建立索引,用一張表來維護頁數,然後通過高效的串連得到資料
缺點:只適合資料數固定的情況,資料不能刪除,維護頁表困難
具體請看, http://blog.chinaunix.net/u/29134/showart_1333566.html
* 3.反向尋找最佳化法
當位移超過一半記錄數的時候,先用排序,這樣位移就反轉了
缺點:order by最佳化比較麻煩,要增加索引,索引影響資料的修改效率,並且要知道總記錄
,位移大於資料的一
引
limit位移演算法
正向尋找: (當前頁 – 1) * 頁長
反向尋找: 總記錄 – 當前頁 * 頁長
做下實驗,看看效能如何
總記錄數:1,628,77
每頁記錄數: 4
總頁數:1,628,775 / 40 = 4072
中間頁數:40720 / 2 = 20360
第21000
正向尋找SQL:
Sql代碼
- SELECT * FROM
abc WHERE BatchID = 123 LIMIT 839960, 40
時間:1.8696 秒
反向尋找sql:
Sql代碼
- SELECT * FROM
abc WHERE BatchID = 123 ORDER BY InputDate DESC LIMIT 788775, 40
時間:1.8336 秒
第30000
正向尋找SQL:
Sql代碼
- SELECT * FROM
abc WHERE BatchID = 123 LIMIT 1199960, 40
時間:2.6493 秒
反向尋找sql:
Sql代碼
- SELECT * FROM
abc WHERE BatchID = 123 ORDER BY InputDate DESC LIMIT 428775, 40
時間:1.0035 秒
注意,反向尋找的結果是是降序desc的,並且InputDate是記錄的插入時間,也可以用主鍵聯合索引,但是不方便。
* 4.limit限制最佳化法
把limit位移量限制低於某個數。。超過這個數等於沒資料,我記得alibaba的dba說過他們是這樣做的
* 5.只查索引法
http://willko.iteye.com/blog/670120
總結:limit的最佳化限制都比較多,所以實際情況用或者不用只能具體情況具體分析了。頁數那麼後,基本很少人看的。。。
- 相關文章推薦:
- python調用mysql預存程序並擷取傳回值
- python操作mysql資料庫的例子
- python MySQLdb的安裝和使用
- 本文來自:愛好Linux技術網
- 本文連結:http://www.ahlinux.com/python/9260.html
mysql分頁limit 最佳化