成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一分鐘帶你了解:為什么MySQL的Count統(tǒng)計(jì)會(huì)越來越慢?

數(shù)據(jù)庫 MySQL
今天帶大家了解一下,為什么MySQL的Count函數(shù)會(huì)越來越慢,count函數(shù)的實(shí)現(xiàn)邏輯是什么,以及如何解決大數(shù)據(jù)量下的統(tǒng)計(jì)需求?

業(yè)務(wù)發(fā)展初期,為了功能的快速實(shí)現(xiàn),遇到統(tǒng)計(jì)行數(shù)的需求時(shí),我們一般都是簡(jiǎn)單的使用count函數(shù)搞定。

但是有的小伙伴可能慢慢會(huì)發(fā)現(xiàn),隨著表中的數(shù)據(jù)越來越多,count統(tǒng)計(jì)數(shù)據(jù)的速度越來越慢,耗時(shí)也越來越長(zhǎng)了。

今天帶大家了解一下,為什么MySQL的count函數(shù)會(huì)越來越慢,count函數(shù)的實(shí)現(xiàn)邏輯是什么,以及如何解決大數(shù)據(jù)量下的統(tǒng)計(jì)需求?

count函數(shù)的執(zhí)行邏輯

我們知道,MySQL分為Server層和引擎層,引擎大家基本使用的都是InnoDB,這里就不再重復(fù)強(qiáng)調(diào)了。

那對(duì)于下面這樣一條sql,MySQL是如何執(zhí)行的呢?

select count(*) from t;

由于我們并沒有使用where條件,那么對(duì)于MySQL來說,從聚簇索引或二級(jí)索引來統(tǒng)計(jì)數(shù)據(jù)都是可以的。

并且普通的二級(jí)索引只存儲(chǔ)了索引鍵以及主鍵,所以相對(duì)于聚簇索引來說,二級(jí)索引樹會(huì)更矮更胖,MySQL會(huì)優(yōu)先使用二級(jí)索引,以達(dá)到減少IO提升性能的目的。

MySQL執(zhí)行count的邏輯如下:

  1. Server通過執(zhí)行器調(diào)用InnoDB的查詢接口,嘗試獲取第一條數(shù)據(jù)。
  2. InnoDB引擎在二級(jí)索引上找到第一條記錄,并返回給Server層。

注意:這里雖然使用count(*)查詢,但是并不需要到聚簇索引上回表,因?yàn)樽罱K的目的是統(tǒng)計(jì)聚合后的行數(shù),回表并沒有什么意義。InnoDB會(huì)給Server返回一個(gè)常數(shù)0,表示這一行記錄有效。

3.Server層收到常數(shù)0,并判斷常數(shù)0不是null,認(rèn)為返回值有效,會(huì)將統(tǒng)計(jì)值+1。

4.Server通過執(zhí)行器調(diào)用InnoDB查詢接口,獲取下一條記錄。

5.InnoDB順著二級(jí)索引找下一條記錄,繼續(xù)返回常數(shù)0。

6.重復(fù)步驟3,4,5,直到將整棵二級(jí)索引樹掃描完,最終將統(tǒng)計(jì)的結(jié)果發(fā)給客戶端。

大家可以看到,MySQL在執(zhí)行count函數(shù)時(shí),會(huì)遍歷某一個(gè)索引樹,查詢樹上所有的記錄進(jìn)行累加統(tǒng)計(jì)。

隨著表中的記錄越來越多,索引樹也會(huì)越來越高,越來越胖。

那么整個(gè)統(tǒng)計(jì)過程也會(huì)越來越耗時(shí)。

這就是為什么count函數(shù)會(huì)越來越慢的原因。

大數(shù)據(jù)量下的如何快速統(tǒng)計(jì)行數(shù)

這里有兩個(gè)考慮的因素:絕對(duì)精準(zhǔn)和允許誤差。

如果在極大數(shù)據(jù)量下,允許有誤差產(chǎn)生。那么我們可以提前維護(hù)一個(gè)變量count,通過記錄表中的增刪改操作,對(duì)這個(gè)變量做相應(yīng)的加減。這樣在獲取行數(shù)時(shí),只需要查詢這個(gè)變量就可以快速獲取結(jié)果了。

如果要求絕對(duì)精準(zhǔn),并且對(duì)性能要求也不太高,那么就繼續(xù)使用count函數(shù)吧。不要覺得這個(gè)方法low,能滿足業(yè)務(wù)的方法都是好方法。

如果對(duì)性能要求也很高,那么OLAP數(shù)據(jù)庫可能會(huì)是一個(gè)好選擇。

不同count函數(shù)的性能差異

經(jīng)常有小伙伴糾結(jié)count(*)、count(1)、count(主鍵)、count(非索引列)的性能差異。

通過上文我們可以知道,使用count(*)時(shí),InnoDB引擎返回的是常數(shù)0,那么自然count(1)返回的也是常數(shù),這兩個(gè)性能可以看做是一致的。

對(duì)于count(主鍵),由于二級(jí)索引樹上直接保存著主鍵id,所以不會(huì)有回表的操作。由于InnoDB返回到Server的是主鍵id,而如果主鍵id又恰巧比較大,比如是一個(gè)較長(zhǎng)的字符串時(shí),性能會(huì)產(chǎn)生稍微的下滑。

對(duì)于count(非索引列),由于需要不停的回表,這種方式性能相對(duì)是非常差的,也是不推薦的一種做法。

按性能排序:count(*) ≈ count(1) > count(主鍵) > count(非索引列)。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2022-06-02 08:46:04

網(wǎng)卡網(wǎng)絡(luò)服務(wù)器

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2016-09-12 17:28:45

云存儲(chǔ)應(yīng)用軟件存儲(chǔ)設(shè)備

2020-07-17 07:44:25

云計(jì)算邊緣計(jì)算IT

2020-07-09 07:37:06

數(shù)據(jù)庫Redis工具

2018-08-17 07:19:34

網(wǎng)絡(luò)故障硬件軟件

2021-12-01 15:18:45

MySQL復(fù)制數(shù)據(jù)庫

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2016-09-14 15:57:53

架構(gòu)分布式系統(tǒng)負(fù)載均衡

2017-12-26 16:24:36

接口代碼數(shù)據(jù)

2021-08-06 08:50:45

加密貨幣比特幣區(qū)塊鏈

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫數(shù)據(jù)

2018-06-26 05:23:19

線程安全函數(shù)代碼

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2011-02-21 17:48:35

vsFTPd

2022-02-22 13:20:57

RSA算法加密

2018-01-14 23:19:25

靜態(tài)動(dòng)態(tài)互聯(lián)網(wǎng)

2015-10-10 14:11:00

互聯(lián)網(wǎng)數(shù)據(jù)挖掘爬蟲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av大片在线 | 久久久久亚洲精品 | 亚洲不卡av在线 | 日本韩国欧美在线观看 | 久久国产精品视频免费看 | 久久久久久久久一区 | 综合精品久久久 | 日本电影一区二区 | 欧美性影院 | 欧美精品电影一区 | 超碰在线影院 | 精品亚洲一区二区三区四区五区 | 久久久久久久久久久福利观看 | 99精品久久久久 | 特级做a爰片毛片免费看108 | 日韩视频精品在线 | 亚洲欧美精品久久 | 三级视频在线观看电影 | 久久精品视频一区二区 | 成人在线播放 | 亚洲综合色网 | jlzzxxxx18hd护士 | 99久久婷婷国产综合精品电影 | 国产在线高清 | 国产精品国产精品国产专区不卡 | 亚洲精品在线视频 | 一区二区激情 | 成年人在线视频 | 韩三级在线观看 | 自拍亚洲 | 亚洲欧美在线视频 | 亚洲在线一区 | 69av在线视频| 中文精品一区二区 | 日韩一区二区在线免费观看 | 日韩精品一区二区三区在线播放 | 精品福利一区二区三区 | 国产黄色大片 | 亚洲精品乱码久久久久久9色 | 精品视频在线观看 | 99精品电影|