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

MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案

 更新時(shí)間:2022年08月11日 08:44:37   作者:一燈架構(gòu)???????  
這篇文章主要介紹了MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

show table status like 'user';

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

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

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

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

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

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

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

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)計(jì)表中的總行數(shù),效率較高。

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

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

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

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

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

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

到此這篇關(guān)于MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案的文章就介紹到這了,更多相關(guān)MySQL 優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 5.7.12 winx64手動(dòng)安裝教程

    mysql 5.7.12 winx64手動(dòng)安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.12 winx64手動(dòng)安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-12-12
  • 你的like語句為什么沒索引詳解

    你的like語句為什么沒索引詳解

    這篇文章主要給大家介紹了關(guān)于你的like語句為什么沒索引的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • Prometheus 插件mysql_exporter安裝過程

    Prometheus 插件mysql_exporter安裝過程

    mysql_exporter是用來收集MysQL或者M(jìn)ariadb數(shù)據(jù)庫相關(guān)指標(biāo)的,mysql_exporter需要連接到數(shù)據(jù)庫并有相關(guān)權(quán)限,這篇文章主要介紹了Prometheus插件安裝(mysql_exporter),需要的朋友可以參考下
    2023-06-06
  • 詳解MySQL如何避免克隆失敗后再次初始化

    詳解MySQL如何避免克隆失敗后再次初始化

    本文章討論了當(dāng)您沒有足夠的磁盤空間來存儲(chǔ)兩個(gè)數(shù)據(jù)集時(shí),使用帶有安全選項(xiàng)DATA DIRECTORY 的 CLONE INSTANCE 命令,所以接下來小編給大家詳細(xì)的介紹一下,MySQL如何避免克隆失敗后再次初始化,需要的朋友可以參考下
    2023-10-10
  • MySQL中慢SQL優(yōu)化方法小結(jié)

    MySQL中慢SQL優(yōu)化方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了MySQL中慢SQL優(yōu)化方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下
    2024-04-04
  • mysql常見問題解決

    mysql常見問題解決

    網(wǎng)上看到了不錯(cuò)的mysql下常見錯(cuò)誤解決方法,特整理下,方便大家學(xué)習(xí)mysql
    2008-02-02
  • MySQL <>和<=> 運(yùn)算符介紹

    MySQL <>和<=> 運(yùn)算符介紹

    這篇文章主要介紹了MySQL <>和<=> 運(yùn)算符介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • mysqlbinlog查看日志[ERROR]unknown variable ‘default-character-set=utf8’

    mysqlbinlog查看日志[ERROR]unknown variable ‘default-ch

    使用mysqlbinlog工具處理MySQL的二進(jìn)制日志文件時(shí),出現(xiàn)[ERROR]unknown variable ‘default-character-set=utf8’,本文將詳細(xì)介紹出現(xiàn)ERROR的原因和如何解決這一問題
    2025-03-03
  • Mysql表的七種類型詳細(xì)介紹

    Mysql表的七種類型詳細(xì)介紹

    Mysql表類型都有哪些是一定需要知道的,下面就為您介紹七種Mysql表類型,希望能對您學(xué)習(xí)Mysql表類型有所幫助,需要的朋友可以了解下
    2012-11-11
  • JDBC連接mysql8和mysql5.7的注意事項(xiàng)

    JDBC連接mysql8和mysql5.7的注意事項(xiàng)

    這篇文章主要介紹了JDBC連接mysql8和mysql5.7的注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

静安区| 长岛县| 石嘴山市| 桦南县| 枞阳县| 宁阳县| 昭通市| 石门县| 巩义市| 永川市| 颍上县| 深泽县| 长宁县| 旌德县| 威宁| 南昌县| 巴楚县| 玉环县| 奇台县| 青田县| 乡城县| 灵寿县| 金山区| 潮安县| 济源市| 阳山县| 普安县| 当雄县| 布尔津县| 宁安市| 阿拉善左旗| 三都| 米泉市| 石景山区| 林州市| 张家港市| 黄浦区| 曲麻莱县| 武威市| 屯门区| 海口市|