以下討論都是基于InnoDB引擎
count是一個聚合函數(shù),InnoDB只負(fù)責(zé)根據(jù)需求返回結(jié)果集,具體的計(jì)算過程再Server層完成
count(主鍵): InnoDB會遍歷整張表,把每一行的id取出來,返回給Server層,server判斷id是否為空,不為空則累加
count(1): InnDB遍歷整張表,但是不取值,Server層對于返回的每一行都會放一個數(shù)字1進(jìn)行,然后判斷是否為空,不為空則累加
-
count(字段):
- 如果字段定義為not null, InnoDB會從表中讀取出這個字段,Server層判斷值不可能為空,直接累加
- 如果字段定義為null, InnoDB從表中讀取整個字段是會將值也讀取出來,Server層判斷值是否為空,不為空則累加
count(
*): Mysql對count(*) 專門做了優(yōu)化,InnoDB再掃描的時(shí)候不取值,返回給Server層,Serve層直接按行累加
所以按效率排序是: count(*) ≈ count(1) > count(主鍵) count(字段)