兩者效能基本相同。經實測與官方文件驗證,優化器會自動將 COUNT(*) 轉換為最適合的欄位計數,無需手寫 COUNT(1) 或 COUNT(pk)。
| 情境 | 表現 |
|---|---|
| 資料量 < 1 萬,已收集統計資訊 | COUNT(1) 略快,差異極微 |
| 資料量 > 1 萬,已收集統計資訊 | COUNT(*) 略快或持平 |
| 資料量 > 10 萬 | COUNT(1) 略快(極小差距) |
| 無主鍵 | COUNT(1) 較快 |
| 有主鍵/聯合主鍵 | COUNT(主鍵) 最快,但 COUNT(*) 自動優化至同等 |
| 單欄位表 | COUNT(*) 最快 |
INDEX FAST FULL SCAN 或 FULL TABLE SCANCOUNT(*) 計算所有行(含 NULL);COUNT(col) 忽略 NULL 值ID=1, DD='e' / ID=2, DD=NULL → COUNT(*)=2,COUNT(DD)=1「
COUNT(*)與COUNT(1)不相上下,優化器處理邏輯相同。建議使用COUNT(*),語意更清晰。」
不要糾結 COUNT(*) vs COUNT(1),應關注: