MySQL - SELECT count(id) 跟 SELECT count(*) 哪個快?
這個問題很有趣,就連用 MySQL 很多年的人也可能不知道(對啦,就是我🤣
答案是:一樣快。
雖然 SELECT count(*)
的語意就像是要走訪所有欄位,感覺就會比 count(id)
來得慢,但其實 count(*)
在 MySQL 是 1 個特殊用法,代表計算多少筆資料,此處米字號並不是所有欄位的意思。
MySQL InnoDB 在處理 count(*)
時會試圖用最小次要索引(smallest available secondary index)計算共有多少筆資料,也就是說就算你明確寫 count(id)
, MySQL 也會使用它所認為比較好的索引計算共有多少筆資料,所以 count(id)
與 count(*)
執行會一樣快。
p.s. MySQL MyISAM 本身就有存資料筆數資訊,所以就不像 InnoDB 需要算
如果不信的話,可以用 EXPLAIN 指令玩看看,應該可以發現它們都會使用同一個索引做查詢。
參考資料來源: MySQL 官方文件
InnoDB processes
SELECT COUNT(*)
statements by traversing the smallest available secondary index unless an index or optimizer hint directs the optimizer to use a different index. If a secondary index is not present, InnoDB processesSELECT COUNT(*)
statements by scanning the clustered index.
p.s. 本文的假設都是 1 個資料表,且沒有任何 WHERE, GROUP BY 等條件的情況