1. 程式人生 > 實用技巧 >MySQL 優化分頁思路

MySQL 優化分頁思路

一般分頁查詢時,通過建立覆蓋索引能夠比較好地提高效能。一個常見又非常頭痛的分頁場景是“limit 1000,20”,此時 MySQL排序出前 1020條記錄後僅僅需要返回第 1001到 1020條記錄,前1000條記錄都會被拋棄,查詢和排序的代價非常高。

1.第一種優化思路

在索引上完成排序分頁的操作,最後根據主鍵關聯回原表查詢所需要的其他列內容

EXPLAIN SELECT film_id, description
FROM film
ORDER BY title
LIMIT 50, 5

直接查詢的時候,能夠從explain的輸出結果中看到優化器實際上做了全表掃描,處理效率不高

EXPLAIN SELECT
a.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 *
FROM
payment 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的查詢,只適合在排序欄位不會出現重複值的特定環境,能夠減輕分頁翻頁的壓力;如果排序欄位出現大量重複值,而仍進行這種優化,那麼分頁結果可能會丟失部分記錄,不適用這種方式進行優化。