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

MySQL?count(*)統(tǒng)計總數(shù)問題匯總

 更新時間:2022年09月20日 14:35:36   作者:一燈架構(gòu)  
在日常開發(fā)工作中,我經(jīng)常會遇到需要統(tǒng)計總數(shù)的場景,比如:統(tǒng)計訂單總數(shù)、統(tǒng)計用戶總數(shù)等,這篇文章主要介紹了MySQL?count(*)統(tǒng)計總數(shù)的問題解析,需要的朋友可以參考下

在日常開發(fā)工作中,我經(jīng)常會遇到需要統(tǒng)計總數(shù)的場景,比如:統(tǒng)計訂單總數(shù)、統(tǒng)計用戶總數(shù)等。一般我們會使用MySQL 的count函數(shù)進行統(tǒng)計,但是隨著數(shù)據(jù)量逐漸增大,統(tǒng)計耗時也越來越長,最后竟然出現(xiàn)慢查詢的情況,這究竟是什么原因呢?本篇文章帶你一下學(xué)習(xí)一下。

1. MyISAM存儲引擎計數(shù)為什么這么快?

我們總有個錯覺,就是感覺MyISAM引擎的count計數(shù)要比InnoDB引擎更快,實際這不是錯覺。

MyISAM引擎把表的總行數(shù)單獨記錄在磁盤上,查詢的時候可以直接返回,不需要再累加統(tǒng)計。

但是當(dāng)SQL查詢中有where條件的時候,就無法再使用表的總行數(shù)了,還是需要乖乖的進行累加統(tǒng)計,查詢性能也就跟InnoDB相差無幾了。

為什么MyISAM引擎能夠記錄表的總行數(shù),InnoDB引擎卻不行?

因為MyISAM引擎不支持事務(wù),只有表鎖,所以記錄的總行數(shù)是準(zhǔn)確的。

而InnoDB引擎支持事務(wù)和行鎖,存在并發(fā)修改的情況。又由于事務(wù)的隔離性,會出現(xiàn)不可重復(fù)讀和幻讀,記錄的總行數(shù)無法保證是準(zhǔn)確的。

2. 能不能手動實現(xiàn)統(tǒng)計總行數(shù)

既然InnoDB引擎沒有幫我們記錄總行數(shù),我們能不能手動記錄總行數(shù),比如使用Redis。

其實也是不行的,使用Redis記錄總行數(shù),至少有下面3個問題:

  • 無法實現(xiàn)事務(wù)之間的隔離
  • 更新丟失,因為i++不是原子操作,當(dāng)然可以使用Lua腳本實現(xiàn)原子操作,更復(fù)雜。
  • Redis是非關(guān)系型緩存數(shù)據(jù)庫,不能當(dāng)作關(guān)系型持久化數(shù)據(jù)庫使用,一般需要設(shè)置過期時間。

由上圖中得知,雖然Redis計數(shù)加1操作放在了事務(wù)里面,但是不受事務(wù)控制的,在事務(wù)沒有提交前,其他查詢依然讀到了最新的總行數(shù),這就是臟讀的情況。

3. InnoDB引擎能否實現(xiàn)快速計數(shù)

有一種辦法,可以粗略估計表的總行數(shù),就是使用MySQL命令:

show table status like 'user';

真實的總行數(shù)有100萬行,預(yù)估有99萬多行,誤差在可接受的范圍內(nèi)。

部分場景適用,比如粗略估計網(wǎng)站的總用戶數(shù)。

4. 四種計數(shù)方式的性能差別

常見的統(tǒng)計總行數(shù)的方式有以下四種:

count(*) 、 count(常量) 、 count(id) 、 count(字段)

InnoDB引擎對count計數(shù)做了優(yōu)化,會選用數(shù)據(jù)量較小的非聚簇索引進行統(tǒng)計。

比如用戶表中有三個索引,分別是主鍵索引、name索引和age索引,使用執(zhí)行計劃查看計數(shù)的時候用到了哪個索引?

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` tinyint NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB COMMENT='用戶表';
explain select count(*) from user;

用到了數(shù)據(jù)量較小的age索引。

count(*) 、 count(常量) 是直接統(tǒng)計表中的總行數(shù),效率較高。

而 count(id) 還需要把數(shù)據(jù)返回給MySQL Server端進行累加計數(shù)。

最后 count(字段)需要篩選不為null字段,效率最差。

四種計數(shù)的查詢性能從高到低,依次是:

count(*) ≈ count(常量) > count(id) > count(字段)

對于大多數(shù)情況,得到計數(shù)結(jié)果,還是老老實實使用count(*)

所以推薦使用select count(*),別跟**select *搞混了,不推薦使用select ***的。

到此這篇關(guān)于MySQL count(*)統(tǒng)計總數(shù)的文章就介紹到這了,更多相關(guān)MySQL count(*)統(tǒng)計總數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何用Navicat操作MySQL

    如何用Navicat操作MySQL

    這篇文章主要介紹了如何用Navicat操作MySQL,幫助大家使用可視化工具來連接 MySQL,感興趣的朋友可以了解下
    2021-05-05
  • MySQL學(xué)習(xí)第三天 Windows 64位操作系統(tǒng)下驗證MySQL

    MySQL學(xué)習(xí)第三天 Windows 64位操作系統(tǒng)下驗證MySQL

    MySQL學(xué)習(xí)第三天教大家如何在Windows 64位操作系統(tǒng)下驗證MySQL,感興趣的小伙伴們可以參考一下
    2016-05-05
  • MySQL 啟動失敗(code=exited, status=1/FAILURE)異常解決方案

    MySQL 啟動失敗(code=exited, status=1/FAILURE)異常解決方案

    在MySQL服務(wù)啟動時遇到啟動失敗問題,通過查看和分析錯誤日志文件,找到并解決了配置文件中的錯誤項,成功重啟了MySQL服務(wù).文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • MySQL全面瓦解之查詢的正則匹配詳解

    MySQL全面瓦解之查詢的正則匹配詳解

    這篇文章主要給大家介紹了關(guān)于MySQL全面瓦解之查詢的正則匹配的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL字符之char、varchar類型簡析

    MySQL字符之char、varchar類型簡析

    varchar和char是MySQL中的兩種數(shù)據(jù)類型,都是用來存儲字符串的,下面這篇文章主要給大家介紹了關(guān)于MySQL字符之char、varchar類型的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • MySQL創(chuàng)建用戶與授權(quán)方法

    MySQL創(chuàng)建用戶與授權(quán)方法

    MySQL中創(chuàng)建用戶與授權(quán)的實現(xiàn)方法,對于剛開始接觸mysql的朋友可以參考下
    2012-11-11
  • mysql mycat 中間件安裝與使用

    mysql mycat 中間件安裝與使用

    MyCAT是MySQL中間件,前身是阿里大名鼎鼎的Cobar,Cobar在開源了一段時間后,不了了之。于是MyCAT扛起了這面大旗,在大數(shù)據(jù)時代,其重要性愈發(fā)彰顯。這篇文章主要是MyCAT的入門部署。
    2017-05-05
  • mysql 循環(huán)批量插入的實例代碼詳解

    mysql 循環(huán)批量插入的實例代碼詳解

    本文通過實例代碼文字相結(jié)合的形式給大家介紹了mysql 循環(huán)批量插入功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • mysql decimal類型判斷是否為0

    mysql decimal類型判斷是否為0

    在MySQL中,DECIMAL是一種用于存儲精確小數(shù)的數(shù)據(jù)類型,本文主要介紹了mysql decimal類型判斷是否為0,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的方法實例

    Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的方法實例

    這篇文章主要給大家介紹了關(guān)于Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論

天台县| 潜江市| 大新县| 南和县| 栾川县| 瓮安县| 普安县| 龙南县| 平陆县| 新昌县| 新安县| 万安县| 卢龙县| 万载县| 五家渠市| 海原县| 马尔康县| 铜梁县| 东丽区| 惠州市| 嘉祥县| 新民市| 方山县| 射阳县| 油尖旺区| 江山市| 施秉县| 寿宁县| 即墨市| 永城市| 乌拉特后旗| 鹤岗市| 东宁县| 旅游| 平阴县| 潜山县| 青神县| 红原县| 石门县| 会东县| 顺昌县|