MySQL count(*),count(1),count(field)區(qū)別购对、性能差異及優(yōu)化建議

count函數(shù)是用來(lái)獲取表中滿足一定條件的記錄數(shù)猾昆,常見用法有三種,count(*),count(1),count(field)骡苞,這三種有什么區(qū)別垂蜗?在性能上有何差異楷扬?本文將通過測(cè)試案例詳細(xì)介紹和分析。

原文地址:
mytecdb.com/blogDetail.php?id=81

三者有何區(qū)別:

  • count(field)不包含字段值為NULL的記錄贴见。
  • count(*)包含NULL記錄烘苹。
  • select(*)與select(1) 在InnoDB中性能沒有任何區(qū)別,處理方式相同片部。官方文檔描述如下:
    InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
1. 性能對(duì)比

通過案例來(lái)測(cè)試一下count(*)镣衡,count(1),count(field)的性能差異档悠,MySQL版本為5.7.19廊鸥,測(cè)試表是一張sysbench生成的表,表名sbtest1辖所,總記錄數(shù)2411645惰说,如下:

CREATE TABLE sbtest1 (
id int(11) NOT NULL AUTO_INCREMENT,
k int(11) DEFAULT NULL,
c char(120) NOT NULL DEFAULT '',
pad char(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY k_1 (k)
) ENGINE=InnoDB;

測(cè)試SQL語(yǔ)句:

select count(*) from sbtest1;
select count(1) from sbtest1;
select count(id) from sbtest1;
select count(k) from sbtest1;
select count(c) from sbtest1;
select count(pad) from sbtest1;

針對(duì)count(*)、count(1)和count(id)缘回,加了強(qiáng)制走主鍵的測(cè)試吆视,如下:
select count(*) from sbtest1 force index(primary);
select count(1) from sbtest1 force index(primary);
select count(id) from sbtest1 force index(primary);

另外對(duì)不同的測(cè)試SQL,收集了profile酥宴,發(fā)現(xiàn)主要耗時(shí)都在Sending data這個(gè)階段啦吧,記錄Sending data值。

匯總測(cè)試結(jié)果:

類型 耗時(shí)(s) 索引 Sending data耗時(shí)(s)
count(*) 0.47 k_1 0.463624
count(1) 0.46 k_1 0.463242
count(id) 0.52 k_1 0.521618
count(*)強(qiáng)制走主鍵 0.54 primay key 0.538737
count(1)強(qiáng)制走主鍵 0.55 primary key 0.545007
count(id)強(qiáng)制走主鍵 0.60 primary key 0.598975
count(k) 0.53 k_1 0.529366
count(c) 0.81 NULL 0.813918
count(pad) 0.76 NULL 0.762040

結(jié)果分析:

  1. 從以上測(cè)試結(jié)果來(lái)看幅虑,count(*)和count(1)性能基本一樣丰滑,默認(rèn)走二級(jí)索引(k_1),性能最好倒庵,這也驗(yàn)證了count(*)和count(1)在InnoDB內(nèi)部處理方式一樣。
  2. count(id) 雖然也走二級(jí)索引(k_1)炫刷,但是性能明顯低于count(*)和count(1)擎宝,可能MySQL內(nèi)部在處理count(*)和count(1)時(shí)做了額外的優(yōu)化。
  3. 強(qiáng)制走主鍵索引時(shí)浑玛,性能反而沒有走更小的二級(jí)索引好绍申,InnoDB存儲(chǔ)引擎是索引組織表,行數(shù)據(jù)在主鍵索引的葉子節(jié)點(diǎn)上顾彰,走主鍵索引掃描時(shí)极阅,處理的數(shù)據(jù)量比二級(jí)索引更多,所以性能不及二級(jí)索引涨享。
  4. count(c)和count(pad)沒有走索引筋搏,性能最差,但是明顯count(pad)比count(c)好厕隧,因?yàn)閜ad字段類型為char(60)奔脐,小于字段c的char(120)俄周,盡管兩者性能墊底,但是字段小的性能相對(duì)更好些髓迎。
2. count(*)延伸
  • 在5.7.18版本之前峦朗,InnoDB處理select count(*) 是通過掃描聚簇索引,來(lái)獲取總記錄數(shù)排龄。
  • 從5.7.18版本開始波势,InnoDB掃描一個(gè)最小的可用的二級(jí)索引來(lái)獲取總記錄數(shù),或者由SQL hint來(lái)告訴優(yōu)化器使用哪個(gè)索引橄维。如果二級(jí)索引不存在艰亮,InnoDB將會(huì)掃描聚簇索引。

執(zhí)行select count(*)在大部分場(chǎng)景下性能都不會(huì)太好挣郭,尤其是表記錄數(shù)特別大的情況下迄埃,索引數(shù)據(jù)不在buffer pool里面,需要頻繁的讀磁盤兑障,性能將更差侄非。

3. count(*)優(yōu)化思路
  1. 一種優(yōu)化方法,是使用一個(gè)統(tǒng)計(jì)表來(lái)存儲(chǔ)表的記錄總數(shù)流译,在執(zhí)行DML操作時(shí)逞怨,同時(shí)更新該統(tǒng)計(jì)表。這種方法適用于更新較少福澡,讀較多的場(chǎng)景叠赦,而對(duì)于高并發(fā)寫操作,性能有很大影響革砸,因?yàn)樾枰l(fā)更新熱點(diǎn)記錄除秀。
  2. 如果業(yè)務(wù)對(duì)count數(shù)量的精度沒有太大要求,可使用show table status中的行數(shù)作為近似值算利。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末册踩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子效拭,更是在濱河造成了極大的恐慌暂吉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缎患,死亡現(xiàn)場(chǎng)離奇詭異慕的,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挤渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門肮街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚂蕴,你說(shuō)我怎么就攤上這事低散「┑耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熔号,是天一觀的道長(zhǎng)稽鞭。 經(jīng)常有香客問我,道長(zhǎng)引镊,這世上最難降的妖魔是什么朦蕴? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弟头,結(jié)果婚禮上吩抓,老公的妹妹穿的比我還像新娘。我一直安慰自己赴恨,他們只是感情好疹娶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伦连,像睡著了一般雨饺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惑淳,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天额港,我揣著相機(jī)與錄音,去河邊找鬼歧焦。 笑死移斩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绢馍。 我是一名探鬼主播向瓷,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痕貌!你這毒婦竟也來(lái)了风罩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舵稠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后入宦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哺徊,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年乾闰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了落追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涯肩,死狀恐怖轿钠,靈堂內(nèi)的尸體忽然破棺而出巢钓,到底是詐尸還是另有隱情,我是刑警寧澤疗垛,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布症汹,位于F島的核電站,受9級(jí)特大地震影響贷腕,放射性物質(zhì)發(fā)生泄漏背镇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一泽裳、第九天 我趴在偏房一處隱蔽的房頂上張望瞒斩。 院中可真熱鬧,春花似錦涮总、人聲如沸胸囱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烹笔。三九已至,卻和暖如春夺克,著一層夾襖步出監(jiān)牢的瞬間箕宙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工铺纽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柬帕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓狡门,卻偏偏與公主長(zhǎng)得像陷寝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子其馏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我因?yàn)樯眢w的原因凤跑,放棄了日更。一下子覺得輕松了好多叛复。 日更仔引,作為愛好就有點(diǎn)過分了。成了壓力和負(fù)擔(dān)褐奥。剛開始是這樣想的...
    成依格閱讀 197評(píng)論 0 1
  • 這個(gè)課叫短程咖耘,這個(gè)短程有三個(gè)階段∏寺耄基礎(chǔ)是同理心儿倒。從一腳在岸上一腳在水中的基礎(chǔ)同心到有經(jīng)驗(yàn),高度覺察的同理心呜笑。同理心...
    余師師閱讀 1,806評(píng)論 0 3
  • 壹 在地鐵站出口溉瓶,看到一個(gè)小姑娘蹲著痛哭流涕急鳄,絲毫不顧及來(lái)往的人群。地上撒滿了傳單堰酿,一看就是拉扯壞掉的手提袋被孤零...
    武漢老汪閱讀 2,164評(píng)論 0 2
  • 酸酸甜又香疾宏。吐吐剝皮瓤 子子妙中藏,顆顆琥珀光触创。
    藍(lán)手印zzy閱讀 377評(píng)論 4 9