前言
在實(shí)際業(yè)務(wù)開發(fā)中,我們常常需要count數(shù)據(jù)表的記錄條數(shù)。關(guān)于使用mysql的count統(tǒng)計(jì)函數(shù),大多開發(fā)者都不會(huì)有疑問(wèn),但是就使用細(xì)節(jié)上,大家的觀點(diǎn)可能就不一致了。一派認(rèn)為count(1)比count(*)要快,說(shuō)count(*)要全表掃描而count(1)則不用。另一派反之。針對(duì)count(主鍵)和count(1)和count(*),大家?guī)缀跻恢抡J(rèn)為count(主鍵)效率較慢。那么實(shí)際情況是這樣么?
本次就來(lái)做個(gè)總結(jié)。
測(cè)試
針對(duì)mysql5.7 innodb引擎,主鍵為id的表,
我們explain count(1)和count(*)以及count(id)和count(name)
explain select SQL_NO_CACHE count(1) from province
explain select SQL_NO_CACHE count(*) from province
explain select SQL_NO_CACHE count(id) from province
explain select SQL_NO_CACHE count(name) from province
然后發(fā)現(xiàn)前三者的執(zhí)行計(jì)劃一摸一樣

而count(name)顯然效率較低

所以我們確定count(*)和count(1)以及count(主鍵)的效率是一致的!
mysql底層對(duì)count()有優(yōu)化,會(huì)選擇最有效率的方式去執(zhí)行count操作,兩者沒(méi)有性能差異,效率都比較高。
總結(jié)
一方面
count(主鍵列),count(),count(1)效率差不多!
count(非主鍵列)的效率往往低于count(),count(1),count(主鍵列)!
另一方面
count(1),count(*)會(huì)統(tǒng)計(jì)表中的所有的記錄數(shù),包含字段為null 的記錄;
count(列名) 會(huì)統(tǒng)計(jì)該字段在表中出現(xiàn)的次數(shù),不統(tǒng)計(jì)字段為null 的記錄。
請(qǐng)關(guān)注我的訂閱號(hào)
