MySQL中count(*)與count(1)哪個更快?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
count(*),count(1),count(主鍵)哪個更快?
1、建表并且插入1000萬條數(shù)據(jù)進(jìn)行實(shí)驗(yàn)測試:
# 創(chuàng)建測試表 CREATE TABLE `t6` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `status` tinyint(4) NOT NULL, PRIMARY KEY (`id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # 創(chuàng)建存儲過程插入1000w數(shù)據(jù) CREATE PROCEDURE insert_1000w() BEGIN DECLARE i INT; SET i=1; WHILE i<=10000000 DO INSERT INTO t6(name,status) VALUES('god-jiang-666',1); SET i=i+1; END WHILE; END; #調(diào)用存儲過程,插入1000萬行數(shù)據(jù) call insert_1000w();
2、分析實(shí)驗(yàn)結(jié)果
# 花了0.572秒 select count(*) from t6;
# 花了0.572秒 select count(1) from t6;
# 花了0.580秒 select count(id) from t6;
# 花了0.620秒 select count(*) from t6 force index (primary);
從上面的實(shí)驗(yàn)我們可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了強(qiáng)制主鍵的情況。
下面我們繼續(xù)測試一下它們各自的執(zhí)行計(jì)劃:
explain select count(*) from t6; show warnings;
explain select count(1) from t6; show warnings;
explain select count(id) from t6; show warnings;
explain select count(*) from t6 force index (primary); show warnings;
從上面的實(shí)驗(yàn)可以得出這三點(diǎn):
count(*)被MySQL查詢優(yōu)化器改寫成了count(0),并選擇了idx_status索引
count(1)和count(id)都選擇了idx_statux索引
加了force index(primary)之后,走了強(qiáng)制索引
這個idx_status就是相當(dāng)于是二級輔助索引樹,目的就是為了說明: InnoDB在處理count(*)的時候,有輔助索引樹的情況下,會優(yōu)先選擇輔助索引樹來統(tǒng)計(jì)總行數(shù)。
為了驗(yàn)證count(*)會優(yōu)先選擇輔助索引樹這個結(jié)論,我們繼續(xù)來看看下面的實(shí)驗(yàn):
# 刪除idx_status索引,繼續(xù)執(zhí)行count(*) alter table t6 drop index idx_status; explain select count(*) from t6;
從以上實(shí)驗(yàn)可以得出,刪除了idx_status這個輔助索引樹,count(*)就會選擇走主鍵索引。所以結(jié)論:count(*)會優(yōu)先選擇輔助索引,假如沒有輔助索引的存在,就會走主鍵索引。
為什么count(*)會優(yōu)先選擇輔助索引?
在MySQL5.7.18之前,InnoDB通過掃描聚集索引來處理count(*)語句。
從MySQL5.7.18開始,InnoDB通過遍歷最小的可用二級索引來處理count(*)語句。如果不存在二級索引,則掃描聚集索引。
新版本為何會使用二級索引來處理count(*)呢?
因?yàn)镮nnoDB二級索引樹的葉子節(jié)點(diǎn)上存放的是主鍵,而主鍵索引樹的葉子節(jié)點(diǎn)存放的是整行數(shù)據(jù),所以二級索引樹比主鍵索引樹小。因此查詢優(yōu)化器基于成本考慮,優(yōu)先選擇的是二級索引。所以索引count(*)快于count(主鍵)。
關(guān)于MySQL中count(*)與count(1)哪個更快問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)站欄目:MySQL中count(*)與count(1)哪個更快-創(chuàng)新互聯(lián)
本文地址:http://jinyejixie.com/article12/dsejdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站收錄、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容