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 processes SELECT COUNT(*) statements by scanning the clustered index.

p.s. 本文的假設都是 1 個資料表,且沒有任何 WHERE, GROUP BY 等條件的情況

追蹤新知

看完這篇文章了嗎?還意猶未盡的話,追蹤粉絲專頁吧!

我們每天至少分享 1 篇文章/新聞或者實用的軟體/工具,讓你輕鬆增廣見聞提升專業能力!如果你喜歡我們的文章,或是想了解更多特定主題的教學,歡迎到我們的粉絲專頁按讚、留言讓我們知道。你的鼓勵,是我們的原力!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!