萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 海量資料分頁優化:從 LIMIT 偏移到延遲關聯與覆蓋索引實戰

問題:傳統 OFFSET 分頁效能崩塌

SELECT * FROM `table` WHERE condition ORDER BY id LIMIT (page-1)*pagesize, pagesize;

資料達百萬筆、翻到第幾百頁時,MySQL 必須掃描並捨棄前 N 筆,耗時秒級。

優化核心:延遲關聯 / 子查詢先定位主鍵

SELECT * FROM `table` 
WHERE id >= (
    SELECT id FROM `table` WHERE condition ORDER BY id LIMIT 126380, 1
) 
ORDER BY id LIMIT 20;

原理:

  1. 內層子查詢只掃描索引(覆蓋索引),極快定位到第 126,381 筆的 id。
  2. 外層用 id >= 值 直接命中聚簇索引,回表僅 20 筆。

前置條件

  • id 為主鍵或唯一索引(聚簇索引鍵)。
  • WHERE condition 欄位有索引支援(或複合索引 (condition_col, id))。
  • 排序欄位與索引順序一致(避免 Filesort)。

進階:游標式分頁(無限滾動最佳)

-- 首頁
SELECT * FROM `table` WHERE condition ORDER BY id LIMIT 20;

-- 往下翻:記住上一頁最後一筆 id = 126380
SELECT * FROM `table` WHERE condition AND id > 126380 ORDER BY id LIMIT 20;

優點:無 OFFSET、效能固定、適合 API 無限滾動。缺點:無法隨機跳頁。

實戰檢查清單

  1. EXPLAIN 確認 type=range/ref、key=PRIMARY、Extra=Using where。
  2. 避免 SELECT *,只取必要欄位配合覆蓋索引。
  3. 大表禁用 SQL_CALC_FOUND_ROWS,改用單獨 COUNT(*)(有索引時極快)。
  4. 緩存首頁/熱門頁面,減少即時查詢壓力。
copyright © 萬盛學電腦網 all rights reserved