mysql分頁limit 最佳化

來源:互聯網
上載者:User

標籤:des   blog   http   io   ar   使用   sp   資料   div   

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

1.子查詢最佳化法

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

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

實驗下

Sql代碼 

  1. mysql> set profiling=1
  2. Query OK, 0 rows affected (0.00 sec

3.4. mysql> select count(*) from Member

  1. +———-
  2. | count(*)
  3. +———-
  4. |   169566
  5. +———-
  6. 1 row in set (0.00 sec

11.12. mysql> pager grep !~

  1. PAGER set to ‘grep !~-

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

  1. 100 rows in set (0.00 sec

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

  1. 100 rows in set (0.00 sec

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

  1. 100 rows in set (0.01 sec

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

  1. 100 rows in set (0.00 sec

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

  1. 100 rows in set (0.10 sec

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

  1. 100 rows in set (0.02 sec

32.33. mysql> nopage

  1. PAGER set to stdou

35.36.37. mysql> show profiles\

  1. ************************  1. row  ***********************
  2. Query_ID:
  3. Duration: 0.0000330
  4. Query: select count(*) from Membe

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

  1. Query_ID:
  2. Duration: 0.0016700
  3. Query: select * from Member limit 10, 10
  4. ************************  3. row  ***********************
  5. Query_ID:
  6. Duration: 0.0011240
  7. Query: select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 10

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

  1. Query_ID:
  2. Duration: 0.0026320
  3. Query: select * from Member limit 1000, 10
  4. ************************  5. row  ***********************
  5. Query_ID:
  6. Duration: 0.0013400
  7. Query: select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 10

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

  1. Query_ID:
  2. Duration: 0.0995670
  3. Query: select * from Member limit 100000, 10
  4. ************************  7. row  ***********************
  5. Query_ID:
  6. Duration: 0.0244770
  7. 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代碼 

  1. SELECT * FROM  abc  WHERE  BatchID  = 123 LIMIT 839960, 40

時間:1.8696 秒

反向尋找sql:

Sql代碼 

  1. SELECT * FROM  abc  WHERE  BatchID  = 123 ORDER BY InputDate DESC LIMIT 788775, 40

時間:1.8336 秒

第30000

正向尋找SQL:

Sql代碼 

  1. SELECT * FROM  abc  WHERE  BatchID  = 123 LIMIT 1199960, 40

時間:2.6493 秒

反向尋找sql:

Sql代碼 

  1. 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 最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.