關於mysql使用過程中limit分頁導致查詢速度慢的優化

最近在項目中遇到一個有意思的事。mysql在查詢過程中耗時很長,找了一下原因,無果。遂去萬能的百度尋求答案,找來找去,感覺自己好像發現了什麼。。。以此記錄一下,下次遇到的話有個解決!!!

先是我最開始的sql語句

select * from table limit 100000,20

執行時間3.26秒

然後優化limit

優化後的sql語句

select * from table where id > (select id from table limit 100000,1) limit 100000,20

運行一下,時間0.11秒

這個提升速度,驚呆了,是不是!

嗯,問題雖然是解決了,但是裏面的原理呢?

繼續深究一下

引用一下大神的文章:傳送門

   來自雅虎的幾位工程師帶來了一篇”EfficientPagination Using MySQL”的報告
   limit10000,20的意思掃描滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裏。
   LIMIT 451350 , 30 掃描了45萬多行,怪不得慢的都堵死了。
   但是
   limit 30 這樣的語句僅僅掃描30行

 

那就行了,那我們就想辦法掃描20行,找到之前的最大記錄,然後在這個記錄之後去掃描,ok,問題解決了

嗯,這就是所謂的子查詢優化法。需要注意的是:子查詢優化法數據必須是連續的,就是說不能有where條件

這個就比較煩人了。當然,還有其他的方法:

倒排表優化法

反向查找優化法

limit限制優化法

只查索引法

上面的這幾個方法自己暫時沒用到,就不一一拿出來說了,畢竟沒用,感觸不深,如果你們需要深究的話,可以再去那邊看看哦。再次附傳送門

mysql的limit優化方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章