日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一分鐘帶你了解:為什么MySQL的Count統(tǒng)計會越來越慢?

馬龍網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

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

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

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

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

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

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

select count(*) from t;

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

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

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

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

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

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

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

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

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

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

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

那么整個統(tǒng)計過程也會越來越耗時。

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

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

這里有兩個考慮的因素:絕對精準和允許誤差。

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

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

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

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

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

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

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

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

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


新聞名稱:一分鐘帶你了解:為什么MySQL的Count統(tǒng)計會越來越慢?
轉(zhuǎn)載來源:http://www.5511xx.com/article/coppcii.html