澄清三種 COUNT 寫法的語義差異、效能迷思與最佳實踐。
| 寫法 | 統計對象 | NULL 處理 | 典型用途 |
|---|---|---|---|
COUNT(*) | 所有列 (整行) | 包含 NULL 行 | 統計總行數,標準 SQL |
COUNT(1) | 常數 1 | 包含 NULL 行 | 統計總行數,等同 COUNT(*) |
COUNT(column) | 指定欄位 | 忽略 NULL | 統計該欄位非空值行數 |
COUNT(*) 和 COUNT(1) 效能完全相同:優化器內部將 COUNT(1) 重寫為 COUNT(*)COUNT(column) 需檢查該欄位是否為 NULL,理論上稍慢,但差異微乎其微SHOW TABLE STATUS 估算、或觸發器同步計數COUNT(*) (語義最清晰、標準 SQL)COUNT(column)COUNT(1)、COUNT('x') 等非標準寫法,降低團隊認知負擔COUNT(*) 可走索引掃描 (Index Only Scan) 極快CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20), status INT);
INSERT INTO t VALUES (1,'a',1), (2,'b',NULL), (3,NULL,2);
SELECT COUNT(*) FROM t; -- 3
SELECT COUNT(1) FROM t; -- 3
SELECT COUNT(name) FROM t; -- 2 (第 3 行 name 為 NULL)
SELECT COUNT(status) FROM t; -- 2 (第 2 行 status 為 NULL)