MySQL 優化分頁思路
阿新 • • 發佈:2021-01-12
一般分頁查詢時,通過建立覆蓋索引能夠比較好地提高效能。一個常見又非常頭痛的分頁場景是“limit 1000,20”,此時 MySQL排序出前 1020條記錄後僅僅需要返回第 1001到 1020條記錄,前1000條記錄都會被拋棄,查詢和排序的代價非常高。
1.第一種優化思路
在索引上完成排序分頁的操作,最後根據主鍵關聯回原表查詢所需要的其他列內容
EXPLAIN SELECT film_id, description FROM film ORDER BY title LIMIT 50, 5
直接查詢的時候,能夠從explain的輸出結果中看到優化器實際上做了全表掃描,處理效率不高
EXPLAIN SELECTa.film_id, a.description FROM film a INNER JOIN ( SELECT film_id FROM film ORDER BY title LIMIT 50, 5 ) b ON a.film_id = b.film_id
按照索引分頁後回表方式改寫SQL後,從explain的輸出結果中已經看不到全表掃描了
這種方式讓MySQL掃描儘可能少的頁面來提高分頁效率。
2.第二種優化思路
把LIMIIT查詢轉換成某個位置的查詢
EXPLAIN SELECT * FROMpayment ORDER BY rental_id DESC LIMIT 410, 10
翻頁的過程中通過增加一個引數last_page_record,用來記錄上一頁最後一行的租賃編號rental_id,例如第41頁最後一行的租賃編號rental_id=15640
那麼在翻頁到第42頁時,可以根據第41頁最後一條記錄向後追溯,相應的SQL可以改寫為
EXPLAIN SELECT * FROM payment WHERE rental_id < 15640 ORDER BY rental_id DESC LIMIT 10
注意,這樣把LIMIT m,n 轉換成LIMIT n的查詢,只適合在排序欄位不會出現重複值的特定環境,能夠減輕分頁翻頁的壓力;如果排序欄位出現大量重複值,而仍進行這種優化,那麼分頁結果可能會丟失部分記錄,不適用這種方式進行優化。