mysql 大資料量分頁最佳化

來源:互聯網
上載者:User

標籤:pre   html   mys   image   執行   .com   中間   mysql   技術分享   

假設有一個千萬量級的表,取1到10條資料;

select * from table limit 0,10;select * from table limit 1000,10;

這兩條語句查詢時間應該在毫秒級完成;

select * from table limit 3000000,10;

你可能沒想到,這條語句執行之間在5s左右;

為什麼相差這麼大?

可能mysql並沒有你想的那麼智能,比如你要查詢 300w開始後面10條資料;mysql會讀取300w加10條這麼多的資料,只不過 過濾後返回最後10條而已!!!

那麼如果解決這個問題呢;這裡總結三種常用方法;

第一種簡單粗暴,就是不允許查看這麼靠後的資料,比如百度就是這樣的

最多翻到76頁就不讓你翻了,這種方式就是從業務上解決;

第二種方法,在查詢下一頁時把上一頁的行id作為參數傳遞給用戶端程式,然後sql就改成了

select * from table where id>3000000 limit 10;

這條語句執行也是在毫秒級完成的,id>300w其實就是讓mysql直接跳到這裡了,不用依次在掃描全面所有的行

如果你的table的主鍵id是自增的,並且中間沒有刪除和斷點,那麼還有一種方式,比如100頁的10條資料

select * from table where id>100*10 limit 10;

最後第三種方法:延遲關聯

我們在來分析一下這條語句為什麼慢,慢在哪裡。

select * from table limit 3000000,10;

玄機就處在這個 * 裡面,這個表除了id主鍵肯定還有其他欄位  比如 name  age  之類的,因為select  *  所以mysql在沿著id主鍵走的時候要回行拿資料,走一下拿一下資料;

如果把語句改成 

select id from table limit 3000000,10;

你會發現時間縮短了一半;然後我們在拿id分別去取10條資料就行了;

語句就改成這樣了:

select table.* from table inner join ( select id from table limit 3000000,10 ) as tmp on tmp.id=table.id;

這三種方法最先考慮第一種 其次第二種,第三種是別無選擇

 

mysql 大資料量分頁最佳化

相關文章

聯繫我們

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