亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

網(wǎng)上流傳的MySQL單表數(shù)據(jù)量不要超過兩千萬(wàn)到底有何理論依據(jù)?

admin
2024年3月15日 15:19 本文熱度 1833

作為一個(gè)合格的 DBA,在遇到線上單表數(shù)據(jù)量超過千萬(wàn)級(jí)別的時(shí)候,往往會(huì)建議用戶通過分表來(lái)縮減單表數(shù)據(jù)量,當(dāng)用戶問為什么單表數(shù)據(jù)量不能超過千萬(wàn)時(shí),DBA 往往會(huì)說(shuō):?jiǎn)伪頂?shù)據(jù)量超過千萬(wàn),會(huì)影響查詢性能。


知其然而不知所以然,學(xué)習(xí)技術(shù)不能停留在表面,而是要進(jìn)一步去深入挖掘其中的原理,這樣才能不斷進(jìn)步和成長(zhǎng)。回到這個(gè)問題:為什么單表數(shù)據(jù)量不能超過兩千萬(wàn),其中的依據(jù)是什么?


事情是這樣的:


小王最近參加了騰訊的技術(shù)面試,面試官向他提了一個(gè)經(jīng)典的面試問題:聊聊你日常項(xiàng)目里的分庫(kù)分表實(shí)踐?


于是小王以過往項(xiàng)目里的某個(gè) case 為例做了回答:


我負(fù)責(zé)的項(xiàng)目里涉及到存儲(chǔ)用戶操作記錄的功能,因?yàn)槊刻斓臄?shù)據(jù)量比較大,差不多超過 5000 萬(wàn)條,所以我另外又做了分庫(kù)分表的操作。系統(tǒng)會(huì)自動(dòng)定時(shí)生成 3 張表,數(shù)據(jù)分別存儲(chǔ)其中,防止都放在一個(gè)表里面導(dǎo)致查詢性能降低。


面試官又問:這里為什么要做一個(gè)分庫(kù)分表的操作呢?如果放在同一張表里面,為什么會(huì)導(dǎo)致查詢性能降低?


小王內(nèi)心 OS:為什么1+1=2?但他還是語(yǔ)氣平常地回答說(shuō):


MySQL 單表不要超過 2000 萬(wàn)行基本上是一個(gè)行業(yè)共識(shí),只有當(dāng)單表行數(shù)超過 500 萬(wàn)行或者單表容量超過 2GB,我們一般才推薦進(jìn)行分庫(kù)分表。


面試官點(diǎn)了點(diǎn)頭表示認(rèn)可,卻也沒有在這個(gè)問題上繼續(xù)深究,繼而問起了別的問題,不久后就結(jié)束了面試。小王回過神來(lái)以后復(fù)盤這次面試過程,覺得自己在 MySQL 分庫(kù)分表問題上沒有回答得特別到位,于是他開始進(jìn)一步地深究起來(lái)這個(gè)“1+1=2”的問題。


一、自增主鍵角度


我們先來(lái)看看單表數(shù)據(jù)量理論上最大值是多少?


假設(shè)我們建表,ID 是自增主鍵,也就是說(shuō)主鍵的大小可以限制表的上限。如果主鍵聲明為 int 類型,那么 int 類型最大為2的32次方 – 1 ,也就是21億左右;


如果主鍵聲明為 bigint 類型,那么 bigint 類型最大為2的64次方 – 1,這個(gè)數(shù)字實(shí)在太大了,一般還沒到這個(gè)限制,磁盤就撐不住了;


如果主鍵聲明為tinyint類型,那么 tinyint 類型最大為2的8次方 – 1,也就是255,所以如果我插入一條 ID=256 的數(shù)據(jù),就會(huì)報(bào)錯(cuò);


上面是從自增主鍵的角度來(lái)講述單表最大數(shù)據(jù)量理論上能達(dá)到多少,那么接下來(lái)從另一個(gè)角度“數(shù)據(jù)頁(yè)”來(lái)闡述一下,單表數(shù)據(jù)量最大能達(dá)到多少,依據(jù)是什么?


二、數(shù)據(jù)頁(yè)角度


假設(shè)我們有一張 user 表,其中 ID 是自增主鍵,那么該表在硬盤文件上是 user.ibd(innodb 數(shù)據(jù)文件,又叫表空間文件)。這個(gè)數(shù)據(jù)文件被劃分成很多的數(shù)據(jù)頁(yè),每個(gè)數(shù)據(jù)頁(yè)大小是16K。



  • 一個(gè)數(shù)據(jù)頁(yè)16K,表的數(shù)據(jù)量很多,一個(gè)數(shù)據(jù)頁(yè)可能放不下那么多數(shù)據(jù),所以數(shù)據(jù)被分成好多份,存放在不同的數(shù)據(jù)頁(yè),為了標(biāo)識(shí)具體是哪一個(gè)數(shù)據(jù)頁(yè),所以需要有頁(yè)號(hào)來(lái)標(biāo)識(shí);

  • 同時(shí)為了把這些存放數(shù)據(jù)的數(shù)據(jù)頁(yè)關(guān)聯(lián)起來(lái),又引入了前后指針,用于指向前后的頁(yè);

  • 數(shù)據(jù)頁(yè)需要讀寫,寫入到一半的過程中可能會(huì)發(fā)生了意外斷電等情況,所以為了保證數(shù)據(jù)頁(yè)的準(zhǔn)確性,還引入了校驗(yàn)碼;

  • 同時(shí)為了在數(shù)據(jù)頁(yè)搜索數(shù)據(jù)提高效率,數(shù)據(jù)頁(yè)內(nèi)部還生成了頁(yè)目錄;

  • 除了上述所說(shuō)的,數(shù)據(jù)頁(yè)內(nèi)剩下的空間就用來(lái)存放實(shí)際的數(shù)據(jù);


即數(shù)據(jù)頁(yè)的結(jié)構(gòu)如下:



數(shù)據(jù)是以數(shù)據(jù)頁(yè)的形式進(jìn)行存儲(chǔ),數(shù)據(jù)頁(yè)和數(shù)據(jù)頁(yè)之間是以B+樹的形式進(jìn)行關(guān)聯(lián),例如:




其中,葉子節(jié)點(diǎn)的數(shù)據(jù)頁(yè)存放的是實(shí)際存儲(chǔ)的數(shù)據(jù),非葉子節(jié)點(diǎn)存放的是索引內(nèi)容。B+樹的每一層代表一次磁盤 IO。


舉個(gè)例子,如果我要尋找 ID=5 的記錄,從頂部非葉子節(jié)點(diǎn)開始查找,由于 ID=5 大于1并且小于7,故應(yīng)該往左邊尋找,來(lái)到頁(yè)號(hào)為6的數(shù)據(jù)頁(yè),由于5大于4,故應(yīng)該往右邊尋找,來(lái)到頁(yè)號(hào)為105的數(shù)據(jù)頁(yè),找到 ID=5 的記錄,完成查詢。


這個(gè)過程中查詢了三個(gè)數(shù)據(jù)頁(yè),如果這三個(gè)數(shù)據(jù)頁(yè)都沒有加載到內(nèi)存,那么就需要經(jīng)歷三次磁盤 IO 查詢。


了解完 B+樹是如何存儲(chǔ)數(shù)據(jù)的,我們就可以開始進(jìn)行數(shù)據(jù)的估算。



假設(shè):非葉子節(jié)點(diǎn)內(nèi)指向其他數(shù)據(jù)頁(yè)的指針數(shù)量為 X(即非葉子節(jié)點(diǎn)的最大子節(jié)點(diǎn)數(shù)為 X);每個(gè)葉子節(jié)點(diǎn)可以存儲(chǔ)的行記錄數(shù)為 Y;B+樹的高度為 N(即  B+樹的層數(shù));


  • 對(duì)于一個(gè)高度為 N 的 B+樹,頂層(根節(jié)點(diǎn))有一個(gè)非葉子節(jié)點(diǎn),那么第二層就有X個(gè)節(jié)點(diǎn),第三層就有 X 的2次方個(gè)節(jié)點(diǎn),第四層就有 X 的三次方個(gè)節(jié)點(diǎn),以此類推,第 N 層(即葉子節(jié)點(diǎn)所在的第 N 層)就有 X 的 N-1 次方個(gè)節(jié)點(diǎn);

  • 在 B+ 樹中,所有的記錄都存儲(chǔ)在葉子節(jié)點(diǎn)中,假設(shè)每個(gè)葉子節(jié)點(diǎn)都可以存儲(chǔ)的行記錄數(shù)為 Y;

  • 那么 B+ 樹可以存儲(chǔ)的數(shù)據(jù)總量為葉子節(jié)點(diǎn)總數(shù)乘以每個(gè)葉子節(jié)點(diǎn)存儲(chǔ)的記錄數(shù),即:M=(X 的 N-1 次方)乘以 Y;


代入計(jì)算:


  • 一個(gè)數(shù)據(jù)頁(yè)大小16K,扣除頁(yè)號(hào)、前后指針、頁(yè)目錄,校驗(yàn)碼等信息,實(shí)際可以存儲(chǔ)數(shù)據(jù)的大約為15K,假設(shè)主鍵ID為bigint型,那么主鍵 ID 占用8個(gè) byte,頁(yè)號(hào)占用4個(gè) byte,則 X=15*1024/(8 + 4) 等于1280;

  • 一個(gè)數(shù)據(jù)頁(yè)實(shí)際可以存儲(chǔ)數(shù)據(jù)的空間大小,大約為15K,假設(shè)一條行記錄占用的空間大小為1K,那么一個(gè)數(shù)據(jù)頁(yè)就可以存儲(chǔ)15條行記錄,即 Y=15;

  • 假設(shè) B+樹是兩層的:則 N=2,即 M=1280的(2-1)次方 * 15 ≈ 2w ;

  • 假設(shè) B+樹是三層的:則 N=3,即 M=1280的2次方 * 15 ≈ 2.5 kw;

  • 假設(shè) B+樹是四層的:則 N=4,即 M=1280的3次方 * 15 ≈ 300億 ;


綜上所述,我們建議單表數(shù)據(jù)量大小在兩千萬(wàn)。當(dāng)然這個(gè)數(shù)據(jù)是根據(jù)每條行記錄的大小為 1K 的時(shí)候估算而來(lái)的,而實(shí)際情況中可能并不是這個(gè)值,所以這個(gè)建議值兩千萬(wàn)只是一個(gè)建議,而非一個(gè)標(biāo)準(zhǔn)。


三、思考


最后考一個(gè)問題:一個(gè)4層的 B+樹,主鍵是 bigint 型,一條記錄平均長(zhǎng)度是1K,不考慮碎片,能存放多少條記錄?


答案:


根據(jù) B+樹存儲(chǔ)數(shù)據(jù)的計(jì)算公式:M = X 的 N-1 次方 * Y:


一個(gè)數(shù)據(jù)頁(yè)大小16K,扣除頁(yè)號(hào)、前后指針、頁(yè)目錄,校驗(yàn)碼等信息,實(shí)際可以存儲(chǔ)數(shù)據(jù)的大約為15K,假設(shè)主鍵 ID 為 bigint 型,那么主鍵 ID 占用8個(gè) byte,頁(yè)號(hào)占用4個(gè)byte,則X=15*1024/(8 + 4) 等于1280;


每條記錄1K大小,一個(gè)數(shù)據(jù)頁(yè)有15K是用來(lái)存儲(chǔ)數(shù)據(jù)的,那么一個(gè)數(shù)據(jù)頁(yè)就能存儲(chǔ)15條記錄;


所有葉子節(jié)點(diǎn)數(shù)量為 X 的 N-1 次方,即1280*1280*1280;存儲(chǔ)的記錄數(shù)總數(shù)為:葉子節(jié)點(diǎn)數(shù)量 * 每個(gè)葉子節(jié)點(diǎn)存儲(chǔ)的記錄數(shù),所以 M = 1280*1280*1280*15。


你,學(xué)會(huì)了嗎?



作者丨肖浩騰
來(lái)源丨公眾號(hào):騰訊云開發(fā)者(ID:QcloudCommunity)


該文章在 2024/3/15 15:19:46 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved