COUNT(*)、COUNT(1)、COUNT(常量):統計所有行數,包含 NULL 行。COUNT(列名):統計該列非 NULL 值的行數,不包含 NULL。| 場景 | 最快寫法 | 原因 |
|---|---|---|
| 表有主鍵 | COUNT(主鍵列) | 聚簇索引葉節點即主鍵,掃描最小 (非葉節點不存數據) |
| 表無主鍵 | COUNT(1) ≈ COUNT(*) | 需掃描二級索引或全表,常量無額外列讀取開銷 |
| 單列表 | COUNT(*) | 唯一列即主鍵/聚簇索引 |
本質:InnoDB 並不存儲行數,需掃描索引統計。優化器會自動選擇最小的二級索引 (或主鍵) 掃描。COUNT(1) 和 COUNT(*) 現代優化器內部處理完全一致,無性能差異。
COUNT(*) 比 COUNT(1) 慢,因為要讀所有列。COUNT(1) 是統計常量 1 的個數。COUNT(*)。SELECT 1 FROM t WHERE ...:返回滿足條件的行數個「1」,常用於 EXISTS 子查詢,只需遍歷索引判斷存在性,無需回表讀列,比 SELECT * 快。SELECT SUM(1):等同 COUNT(*),但 SUM 可傳入任意數值 (含負數/浮點),結果為 值 × 行數。COUNT(*) (標準 SQL、語義清晰、優化器最優)。COUNT(具體列名)。EXISTS (SELECT 1 ...)。COUNT(*),考慮緩存計數、觸發器維護計數表或近似算法 (如 EXPLAIN rows 估值)。