count是一種最簡單的聚合函數,一般也是我們第一個開始學習的聚合函數,那么他們之間究竟由什么區別呢?
有的人說count(1)和count(*)他們之間有區別,而有的人說他們之間沒有區別那么他們之間到底有沒有區別呢。
從執行結果來說:
count(1)和count(*)之間沒有區別,因為count(*)count(1)都不會去過濾空值,
但count(列名)就有區別了,因為count(列名)會去過濾空值。
從執行效率來說:
他們之間根據不同情況會有些許區別,MySQL會對count(*)做優化。
(1)如果列為主鍵,count(列名)效率優於count(1)
(2)如果列不為主鍵,count(1)效率優於count(列名)
(3)如果表中存在主鍵,count(主鍵列名)效率最優
(4)如果表中只有一列,則count(*)效率最優
(5)如果表有多列,且不存在主鍵,則count(1)效率優於count(*)
---------------------------------------------------------------------------------------------------------
補充關於count(1)count(*)原理 引用百度知道專業回答
count(1),其實就是計算一共有多少符合條件的行。
1並不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這么一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
count(*),執行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。