《MySQL——count()逻辑》
count()用法
count()語(yǔ)義:該函數(shù)為一個(gè)聚合函數(shù),對(duì)于返回的結(jié)果集一行行地判斷,如果count函數(shù)地參數(shù)不是NULL,累計(jì)值就加1,否則不加。最后返回累計(jì)值。
所以count(*),count(主鍵id)和count(1)都表示返回滿足條件地結(jié)果集地總行數(shù);
而count(字段)則表示返回滿足條件地?cái)?shù)據(jù)行里面,參數(shù)“字段”不為NULL的總個(gè)數(shù)。
count(主鍵id):
InnoDB引擎會(huì)遍歷整張表,把每一行的id值都取出來(lái),返回給server層。
sever層拿到id后,判斷id是不可能為空的,就按行累加
count(1):
InnoDB引擎遍歷整張表,但不取值。server層對(duì)于返回的每一行,放一個(gè)數(shù)字“1”進(jìn)去,判斷是不可能為空的,按行累加
count(字段):
1、如果這個(gè)字段定義為not null的話,一行行地從記錄里面讀出這個(gè)字段,判斷不能為null,按行累加
2、如果這個(gè)字段允許為null,那么在執(zhí)行的時(shí)候,要判斷字段是否為null,不是null才累加
count(*):
不會(huì)把全部字段取出來(lái),而是專門做了優(yōu)化,不取值。并且count(*)肯定不是null,按行累加。
所以按照效率排序的話: count(字段) < count(主鍵id) < count(1) 約等于 count(*)
InnoDB是支持事務(wù)的,MyISAM不支持事務(wù)。
InnoDB每一行記錄都要判斷自己是否對(duì)這個(gè)會(huì)話是否可見(jiàn),所以對(duì)于count(*)請(qǐng)求來(lái)說(shuō),InnoDB只好把數(shù)據(jù)一行一行地讀出依次判斷,可見(jiàn)地行才能夠用于計(jì)算“基于這個(gè)查詢”地表地總行數(shù)。
總結(jié)
以上是生活随笔為你收集整理的《MySQL——count()逻辑》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《MySQL——给长字符串加索引》
- 下一篇: 《MySQL——order by逻辑(全