mysql - 用php數組的array_slice分頁和用limit查詢分頁哪個效率更高?

來源:互聯網
上載者:User
以前一直用的limit來分頁,現在發現array_slice分頁挺好用的,就是不知道效率會不會太低

回複內容:

以前一直用的limit來分頁,現在發現array_slice分頁挺好用的,就是不知道效率會不會太低

sql:select * from 表 limit m offset n.

這是正常的翻頁的業務需求.

在一張count為200w的表上執行一下sql:
select * from 表 limit 1000000,5

執行時間:25s

問題:
MySQL裡對LIMIT OFFSET的處理方式是,取出OFFSET+LIMIT的所有資料,然後去掉OFFSET,返回底部的LIMIT。
這種方式在offset很高的情況下,如:limit 100000,20,這樣系統會查詢100020條,然後把前面的100000條都扔掉,這是開銷很大的操作,導致慢查詢很慢.

如何最佳化:

  1. 用id>m limit n 取代,比用 limit m,n 快很多,原因在於與利用上了主鍵索引, 只查詢了n條記錄. 這種方法很適合資料載入,但是不一定適合前台的翻頁情境,
    因為ID可能不連續, 在電梯模式的翻頁中不適用,只是用扶梯模式的翻頁。
    select * from 表 where id > 1000000 limit 5
    執行一下:0.013s

還有一個簡單的最佳化辦法是使用覆蓋查詢(covering index)查詢,然後再跟全行的做join操作。這樣可以直接使用index得到資料,而不去查詢表,當找到需要的資料之後,在與全表join,獲得其他的列。
如:
select * from 表 inner join (select id from 表 limit 1000000,5) as lim on 表.id = lim.id

執行時間:0.211s

array_slice 分頁?你確定要全部查出來在伺服器分頁,而不是在資料庫中查詢某一頁的資料

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.