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