單表 10GB+,統計 UV 查詢:
SELECT COUNT(DISTINCT nick) FROM user_access;
雖有 nick 索引,執行計劃顯示 type=index(全索引掃描),耗時 52.78 秒,造成伺服器抖動。
索引按 nick 升序儲存。原查詢逐行掃描所有重複 nick;若能「跳躍」至下一個不同值,即為 Loose Index Scan(Oracle 原生支援,MySQL 5.1 未直接支援)。
SELECT COUNT(*) FROM (SELECT DISTINCT nick FROM user_access) t;
| 指標 | 原始寫法 | 優化寫法 |
|---|---|---|
| 執行時間 | 52.78 秒 | 5.81 秒(快 9 倍) |
| Extra 欄位 | Using index | Using index for group-by |
| 掃描行數 | 19,546,123 | 2,124,695 |
DISTINCT 優化為 GROUP BYUsing index for group-by)COUNT(*) 僅統計行數,無需回表WHERE 條件或條件可下推