最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊MySQL的COUNT(*)的性能

 更新時間:2020年11月29日 09:44:58   作者:god-jiang  
這篇文章主要介紹了聊聊MySQL的COUNT(*)的性能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

基本職場上的程序員用來統(tǒng)計數(shù)據(jù)庫表的行數(shù)都會使用count(*),count(1)或者count(主鍵),那么它們之間的區(qū)別和性能你又是否了解呢?

其實程序員在開發(fā)的過程中,在一張大表上統(tǒng)計總行數(shù)是非常耗時的一個操作,那么我們應該用哪個方法統(tǒng)計會更快呢?

接下來我們就來聊一聊MySQL中統(tǒng)計總行數(shù)的方法和性能。

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

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

# 創(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、分析實驗結果

# 花了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);

在這里插入圖片描述

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

下面我們繼續(xù)測試一下它們各自的執(zhí)行計劃:

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;

在這里插入圖片描述

在這里插入圖片描述

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

  1. count(*)被MySQL查詢優(yōu)化器改寫成了count(0),并選擇了idx_status索引
  2. count(1)和count(id)都選擇了idx_statux索引
  3. 加了force index(primary)之后,走了強制索引

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

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

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

explain select count(*) from t6;

在這里插入圖片描述

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

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

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

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

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

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

總結

這篇文章的結論就是count(*)=count(1)>count(id)。

為什么count(id)走了主鍵索引還會更慢呢?因為count(id)需要取出主鍵,然后判斷不為空,再累加,代價更高。

count(*)是會總計出所有NOT NULL和NULL的字段,而count(id)是不會統(tǒng)計NULL字段的,所以我們在建表的盡量使用NOT NULL并且給它一個默認是空即可。

最后,在以后總計數(shù)據(jù)庫表的總行數(shù)的時候,可以大膽的使用count(*)或者count(1)。

參考資料

  • 《高性能MySQL》(第三版)第六章優(yōu)化COUNT()查詢
  • 《MySQL實戰(zhàn)45講》林曉斌

到此這篇關于聊聊MySQL的COUNT(*)的性能的文章就介紹到這了,更多相關MySQL COUNT(*)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SQL行列轉置以及非常規(guī)的行列轉置示例代碼

    SQL行列轉置以及非常規(guī)的行列轉置示例代碼

    轉置即旋轉數(shù)據(jù)表的橫縱方向,常用來改變數(shù)據(jù)布局,以便用新的角度觀察,下面這篇文章主要給大家介紹了關于SQL行列轉置以及非常規(guī)行列轉置的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • 淺析MySQL數(shù)據(jù)的導出與導入知識點

    淺析MySQL數(shù)據(jù)的導出與導入知識點

    在本文里我們給大家分享了關于MySQL數(shù)據(jù)的導出與導入的相關實例和知識點內(nèi)容,需要的朋友們跟著學習下。
    2019-03-03
  • 一文理解MySQL數(shù)據(jù)庫的約束與表的設計

    一文理解MySQL數(shù)據(jù)庫的約束與表的設計

    約束是用來限制表中的數(shù)據(jù)長什么樣子的,即什么樣的數(shù)據(jù)可以插入到表中,什么樣的數(shù)據(jù)插入不到表中,下面這篇文章主要給大家介紹了關于如何通過一文理解MySQL數(shù)據(jù)庫的約束與表的設計的相關資料,需要的朋友可以參考下
    2022-11-11
  • 分享幾個簡單MySQL優(yōu)化小妙招

    分享幾個簡單MySQL優(yōu)化小妙招

    這篇文章主要介紹了分享幾個簡單MySQL優(yōu)化小妙招,分享內(nèi)容有、設置大小寫不敏感、MySql?的用戶和權限管理等內(nèi)容,需要的小伙伴可以參考一下,需要的朋友可以參考下
    2022-03-03
  • MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息

    MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息

    這篇文章主要介紹了MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MySQL四種備份表的實現(xiàn)方式

    MySQL四種備份表的實現(xiàn)方式

    本文主要介紹了MySQL四種備份表的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • 數(shù)據(jù)庫的用戶帳號管理基礎知識

    數(shù)據(jù)庫的用戶帳號管理基礎知識

    數(shù)據(jù)庫的用戶帳號管理基礎知識...
    2006-11-11
  • MySQL里實現(xiàn)類似SPLIT的分割字符串的函數(shù)

    MySQL里實現(xiàn)類似SPLIT的分割字符串的函數(shù)

    SQL對字符串的處理能力比較弱,比如我要循環(huán)遍歷象1,2,3,4,5這樣的字符串,如果用數(shù)組的話,遍歷很簡單,但是T-SQL不支持數(shù)組,所以處理下來比較麻煩
    2012-09-09
  • mysql?order?by?排序原理解析

    mysql?order?by?排序原理解析

    當涉及到大量數(shù)據(jù)時,對于?ORDER?BY?操作,可以考慮為相應的列添加索引,如果不使用索引,mysql會使用filesort來進行排序,這篇文章主要介紹了mysql?order?by?排序原理,需要的朋友可以參考下
    2024-02-02
  • 深入MYSQL中的COLLATE

    深入MYSQL中的COLLATE

    MYSQL COLLATE是用于指定字符集的排序規(guī)則的關鍵詞,它可以用于在查詢中對字符數(shù)據(jù)進行排序和比較,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論

逊克县| 宜章县| 西乌| 盐池县| 韩城市| 青浦区| 绥芬河市| 嫩江县| 泉州市| 南汇区| 台东县| 阿合奇县| 温泉县| 河南省| 镇雄县| 巴南区| 额尔古纳市| 孟村| 调兵山市| 安庆市| 班戈县| 武威市| 磴口县| 额济纳旗| 肥城市| 阿拉善右旗| 盐源县| 大厂| 玉溪市| 鄄城县| 禹城市| 贵阳市| 临沭县| 望江县| 灵丘县| 郧西县| 淅川县| 四川省| 兴城市| 临夏市| 梁河县|