【開發筆記】- MySQL中limit查詢超級慢,怎么辦?


有如下解決方法:

(1)、通過判斷id的范圍來分頁

select  id,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG where id>5000000 limit 10;
也得到了分頁的數據,但是我們發現如果id不是順序的,也就是如果有數據刪除過的話,那么這樣分頁數據就會不正確,這個是有缺陷的。

(2)、通過between  and 代替limit(前提:知道具體的位置)

(3)、通過連接查詢來分頁

我們可以先查詢500w條數據開始分頁的那10個id,然后通過連接查詢顯示數據
select id,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG inner join(select id from LOG  limit 5000000,10)as lim using(id);
 
優化分頁查詢的一個最簡單的方法就是盡可能地使用索引覆蓋掃描,而不是查詢所有的列。然后根據需要做一次關聯操作再返回所需的列。對於偏移量很大的時候,這樣做的效率會提升非常大。
 
例如,有如下查詢:
 
select id,LOG_WHO,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG order by LOG_CREATE_TIME limit 5000000,10;
 
注:LOG_CREATE_TIME有一個btree索引
 

改寫后的性能

select id,LOG_WHO,LOG_CREATE_TIME,LOG_OPERATED_TYPE from LOG inner join(select id from LOG order by LOG_CREATE_TIME limit 5000000,10)as lim using(id);
 
這里的“延遲關聯”將大大提升查詢效率,它讓mysql掃描盡可能少的頁面,獲取需要訪問的記錄后在根據關聯列回原表查詢需要的所有列,這個技術也可以用於優化關聯查詢中的limit子句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM