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

SQL COUNT 函數差異解析:COUNT(1) vs COUNT(*) vs COUNT(欄位)

     編輯:MySQL 綜合教學

SQL COUNT 函數差異解析:COUNT(1) vs COUNT(*) vs COUNT(欄位)

澄清三種 COUNT 寫法的語義差異、效能迷思與最佳實踐。

語義差異

寫法統計對象NULL 處理典型用途
COUNT(*)所有列 (整行)包含 NULL 行統計總行數,標準 SQL
COUNT(1)常數 1包含 NULL 行統計總行數,等同 COUNT(*)
COUNT(column)指定欄位忽略 NULL統計該欄位非空值行數

效能真相

  • MySQL InnoDB 中 COUNT(*) 和 COUNT(1) 效能完全相同:優化器內部將 COUNT(1) 重寫為 COUNT(*)
  • COUNT(column) 需檢查該欄位是否為 NULL,理論上稍慢,但差異微乎其微
  • 真正影響效能的是:是否有 WHERE 條件、是否走索引、表大小
  • 大表統計總行數建議:維護計數表、使用 SHOW TABLE STATUS 估算、或觸發器同步計數

最佳實踐建議

  1. 統計總行數 → 統一用 COUNT(*) (語義最清晰、標準 SQL)
  2. 統計特定欄位非空值 → COUNT(column)
  3. 避免 COUNT(1)、COUNT('x') 等非標準寫法,降低團隊認知負擔
  4. 複合索引覆蓋查詢時,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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved