首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Loose Index Scan 優化原理:從 COUNT(DISTINCT) 全掃描到 Using index for group-by,mysqlloose

     編輯:MySQL 綜合教學

MySQL Loose Index Scan:跳過重復索引掃描的利器

一、問題背景

SELECT COUNT(DISTINCT a) FROM table1;  -- a 上有索引

早期版本(≤5.1)執行計劃:type=index, Extra=Using index → **索引全掃描**,逐行讀取、去重,效率極低。

二、社區常見改寫技巧

SELECT COUNT(*) FROM (SELECT DISTINCT a FROM table1) t;

執行計劃變為 Extra=Using index for group-by,利用派生表觸發 Loose Index Scan。

三、現代版本(5.5+)原生支援 Loose Index Scan

執行計劃顯示 Using index for group-by

無需手工改寫,優化器自動識別 COUNT(DISTINCT col) / GROUP BY col + MIN/MAX 等模式,直接在索引上跳躍掃描,跳過重復鍵值頁面。

四、官方文檔對比:普通掃描 vs Loose Index Scan

維度普通掃描 (Tight Index Scan)Loose Index Scan
掃描範圍所有滿足 WHERE 的索引條目僅各組首條記錄,跳過重復鍵
臨時表通常需要不需要
filesort通常需要不需要
Extra 顯示Using index / Using temporary; Using filesortUsing index for group-by
適用聚合任意MIN、MAX、COUNT(DISTINCT)、SUM(DISTINCT)、AVG(DISTINCT)

五、觸發條件回顧(同文章 172702)

  • 單表、GROUP BY 列為索引最左前綴
  • 聚合僅 MIN/MAX 或 DISTINCT 聚合
  • 索引中間列有常量等值條件
  • 無前綴索引

六、實戰建議

  1. **升級到 5.5+**,享受原生 Loose Index Scan
  2. **建立合適的複合索引** 支援常用 GROUP BY 列
  3. **避免 SELECT \*** 破壞覆蓋索引
  4. **大表分組聚合** 必看執行計劃 Extra 確認是否觸發
Loose Index Scan 是 MySQL 優化器針對「有序索引 + 分組聚合」的經典優化,理解其觸發條件,能讓你在設計索引、編寫報表 SQL 時事半功倍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved