中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中count(*)與count(1)哪個更快

發布時間:2020-11-30 15:15:59 來源:億速云 閱讀:415 作者:Leah 欄目:開發技術

MySQL中count(*)與count(1)哪個更快?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

count(*),count(1),count(主鍵)哪個更快?

1、建表并且插入1000萬條數據進行實驗測試:

# 創建測試表
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;

# 創建存儲過程插入1000w數據
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;

#調用存儲過程,插入1000萬行數據
call insert_1000w();

2、分析實驗結果

# 花了0.572秒
select count(*) from t6;

MySQL中count(*)與count(1)哪個更快

# 花了0.572秒
select count(1) from t6;

MySQL中count(*)與count(1)哪個更快

# 花了0.580秒
select count(id) from t6;

MySQL中count(*)與count(1)哪個更快

# 花了0.620秒
select count(*) from t6 force index (primary);

MySQL中count(*)與count(1)哪個更快

從上面的實驗我們可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了強制主鍵的情況。

下面我們繼續測試一下它們各自的執行計劃:

explain select count(*) from t6;
show warnings;

MySQL中count(*)與count(1)哪個更快

MySQL中count(*)與count(1)哪個更快

explain select count(1) from t6;
show warnings;

MySQL中count(*)與count(1)哪個更快

MySQL中count(*)與count(1)哪個更快

explain select count(id) from t6;
show warnings;

MySQL中count(*)與count(1)哪個更快

MySQL中count(*)與count(1)哪個更快

explain select count(*) from t6 force index (primary);
show warnings;

MySQL中count(*)與count(1)哪個更快

MySQL中count(*)與count(1)哪個更快

從上面的實驗可以得出這三點:

  1. count(*)被MySQL查詢優化器改寫成了count(0),并選擇了idx_status索引

  2. count(1)和count(id)都選擇了idx_statux索引

  3. 加了force index(primary)之后,走了強制索引

這個idx_status就是相當于是二級輔助索引樹,目的就是為了說明: InnoDB在處理count(*)的時候,有輔助索引樹的情況下,會優先選擇輔助索引樹來統計總行數。

為了驗證count(*)會優先選擇輔助索引樹這個結論,我們繼續來看看下面的實驗:

# 刪除idx_status索引,繼續執行count(*)
alter table t6 drop index idx_status;

explain select count(*) from t6;

MySQL中count(*)與count(1)哪個更快

從以上實驗可以得出,刪除了idx_status這個輔助索引樹,count(*)就會選擇走主鍵索引。所以結論:count(*)會優先選擇輔助索引,假如沒有輔助索引的存在,就會走主鍵索引。

為什么count(*)會優先選擇輔助索引?

在MySQL5.7.18之前,InnoDB通過掃描聚集索引來處理count(*)語句。

從MySQL5.7.18開始,InnoDB通過遍歷最小的可用二級索引來處理count(*)語句。如果不存在二級索引,則掃描聚集索引。

新版本為何會使用二級索引來處理count(*)呢?

因為InnoDB二級索引樹的葉子節點上存放的是主鍵,而主鍵索引樹的葉子節點存放的是整行數據,所以二級索引樹比主鍵索引樹小。因此查詢優化器基于成本考慮,優先選擇的是二級索引。所以索引count(*)快于count(主鍵)。

關于MySQL中count(*)與count(1)哪個更快問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南川市| 新晃| 射洪县| 襄汾县| 蚌埠市| 田东县| 田林县| 奈曼旗| 安达市| 海兴县| 柳江县| 鸡西市| 兴宁市| 余江县| 雅安市| 诸城市| 兴山县| 彭州市| 台湾省| 淮北市| 乐都县| 永年县| 长葛市| 嘉祥县| 开阳县| 贵州省| 镇沅| 阜新市| 于都县| 建始县| 芦溪县| 广水市| 青田县| 光泽县| 汾西县| 达拉特旗| 桦川县| 江城| 商城县| 罗源县| 柯坪县|