SELECT COUNT(*) FROM table_name 是個再常見不過的統(tǒng)計需求了。
本文帶你了解下Mysql 的COUNT 函數(shù),。
一、COUNT 函數(shù)
關(guān)于COUNT 函數(shù),,在MySQL 官網(wǎng)中有詳細介紹:
翻譯一下:
COUNT(expr) ,,返回SELECT 語句檢索的行中expr 的值不為NULL 的數(shù)量,結(jié)果是一個BIGINT 值。
- 如果查詢結(jié)果沒有命中任何記錄,,則返回
0
COUNT(*) 的統(tǒng)計結(jié)果中,,會包含值為NULL 的行數(shù)。
在《阿里巴巴Java開發(fā)手冊》也有如下要求:
二、COUNT(列名) 、COUNT(常量) 和COUNT(*)
前面我們提到過COUNT(expr) 用于做行數(shù)統(tǒng)計,,那么COUNT(列名) ,、 COUNT(常量) 和 COUNT(*) 這三種語法中,expr 分別是列名,、 常量 和 * ,。
2.1 COUNT(*) 和COUNT(常量)
在列名、常量和 * 這三個條件中,,常量是一個固定值,,肯定不為NULL 。* 可以理解為查詢整行,,所以肯定也不為NULL ,,那么就只有列名的查詢結(jié)果可能是NULL 。
所以,, COUNT(常量) 和 COUNT(*) 表示的是直接查詢符合條件的數(shù)據(jù)庫表的行數(shù),。而COUNT(列名) 表示的是查詢符合條件的列的值不為NULL 的行數(shù)。
2.2 COUNT(*) 和COUNT(1) 區(qū)別
COUNT(1) 就是COUNT(常量) ,,對于這二者到底有沒有區(qū)別:
- 有的說
COUNT(*) 執(zhí)行時會轉(zhuǎn)換成COUNT(1) ,,所以COUNT(1) 少了轉(zhuǎn)換步驟,所以更快,。
- 還有的說,,因為
MySQL 針對COUNT(*) 做了特殊優(yōu)化,所以COUNT(*) 更快,。
到底哪種說法是對的,?看下MySQL 官方文檔:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
通過文檔,對于COUNT(1) 和COUNT(*) ,,MySQL 的優(yōu)化是完全一樣的,,根本不存在誰比誰快!
2.3 COUNT(列名)
相較于前兩者,,COUNT(列名) 的查詢就比較簡單粗暴了,,就是進行全表掃描,然后判斷指定字段的值是不是為NULL ,,不為NULL 則累加,。
相比COUNT(*) ,COUNT(列名) 多了一個步驟就是判斷所查詢的字段是否為NULL ,,所以他的性能要比COUNT(*) 慢,。
here和group的條件查詢。
2.4 SQL92
除了查詢得到結(jié)果集有區(qū)別之外,,COUNT(*) 相比COUNT(常量) 和 COUNT(列名) 來講,,COUNT(*) 是SQL92 定義的標(biāo)準(zhǔn)統(tǒng)計行數(shù)的語法,,因為他是標(biāo)準(zhǔn)語法,所以MySQL 數(shù)據(jù)庫對他進行過很多優(yōu)化,。
SQL92 ,,是數(shù)據(jù)庫的一個ANSI/ISO 標(biāo)準(zhǔn)。它定義了一種語言(SQL )以及數(shù)據(jù)庫的行為(事務(wù),、隔離級別等)。
2.5 COUNT(*) 優(yōu)化
因為COUNT(*) 是SQL92 定義的標(biāo)準(zhǔn)統(tǒng)計行數(shù)的語法,,所以MySQ L對其進行了很多優(yōu)化:
MyISAM 中會直接把表的總行數(shù)單獨記錄下來供COUNT(*) 查詢
InnoDB 會在掃表的時候選擇最小的索引來降低成本,。
這些優(yōu)化的前提都是沒有進行where 和group 的條件查詢,更多請參考MySQL 全表 COUNT(*) 簡述
三,、總結(jié)
COUNT 函數(shù)用于統(tǒng)計表行數(shù),,按照效率比較的話:
count(*)=count(常量)>count(列名)
3.1 小建議
既然 count(*) 在查詢上依賴于所有的數(shù)據(jù)集,所以我們在設(shè)計上也需要盡量的規(guī)避全量 count ,。
通常情況我們針對可預(yù)見的 count 查詢會做適當(dāng)?shù)木彺?,可以?Redis ,也可以是獨立的 MySQL count 表,。
3.2 技術(shù)交流
- 風(fēng)塵博客
- 風(fēng)塵博客-掘金
- 風(fēng)塵博客-博客園
- Github
|