淺談mysql一張表到底能存多少數(shù)據(jù)
程序員平時(shí)和mysql打交道一定不少,可以說(shuō)每天都有接觸到,但是mysql一張表到底能存多少數(shù)據(jù)呢?計(jì)算根據(jù)是什么呢?接下來(lái)咱們逐一探討
知識(shí)準(zhǔn)備
數(shù)據(jù)頁(yè)
在操作系統(tǒng)中,我們知道為了跟磁盤(pán)交互,內(nèi)存也是分頁(yè)的,一頁(yè)大小4KB。同樣的在MySQL中為了提高吞吐率,數(shù)據(jù)也是分頁(yè)的,不過(guò)MySQL的數(shù)據(jù)頁(yè)大小是16KB。(確切的說(shuō)是InnoDB數(shù)據(jù)頁(yè)大小16KB)。詳細(xì)學(xué)習(xí)可以參考官網(wǎng)我們可以用如下命令查詢到。
mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec)
今天咱們數(shù)據(jù)頁(yè)的具體結(jié)構(gòu)指針等不深究,知道它默認(rèn)是16kb就行了,也就是說(shuō)一個(gè)節(jié)點(diǎn)的數(shù)據(jù)大小是16kb
索引結(jié)構(gòu)(innodb)
mysql的索引結(jié)構(gòu)咱們應(yīng)該都知道,是如下的b+樹(shù)結(jié)構(gòu)
通常b+樹(shù)非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只有葉子節(jié)點(diǎn)(最下面一層)才存儲(chǔ)數(shù)據(jù),那么咱們說(shuō)回節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)指的是(對(duì)于上圖而言)
每個(gè)紅框選中的部分稱為一個(gè)節(jié)點(diǎn),而不是說(shuō)某個(gè)元素。了解了節(jié)點(diǎn)的概念和每個(gè)節(jié)點(diǎn)的大小為16kb之后,咱們計(jì)算mysql能存儲(chǔ)多少數(shù)據(jù)就容易很多了
具體計(jì)算方法
根節(jié)點(diǎn)計(jì)算
首先咱們只看根節(jié)點(diǎn)
比如我們?cè)O(shè)置的數(shù)據(jù)類型是bigint,大小為8b
在數(shù)據(jù)本身如今還有一小塊空間,用來(lái)存儲(chǔ)下一層索引數(shù)據(jù)頁(yè)的地址,大小為6kb
所以我們是可以計(jì)算出來(lái)一個(gè)數(shù)據(jù)為(8b+6b=14b)的空間(以bigint為例)我們剛剛說(shuō)到一個(gè)數(shù)據(jù)頁(yè)的大小是16kb,也就是(161024)b,那么根節(jié)點(diǎn)是可以存儲(chǔ)(161024/(8+6))個(gè)數(shù)據(jù)的,結(jié)果大概是1170個(gè)數(shù)據(jù)如果跟節(jié)點(diǎn)的計(jì)算方法計(jì)算出來(lái)了,那么接下來(lái)的就容易了。
其余層節(jié)點(diǎn)計(jì)算
第二層其實(shí)比較容易,因?yàn)槊總€(gè)節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)和跟節(jié)點(diǎn)一樣,而且在跟節(jié)點(diǎn)每個(gè)元素都會(huì)延伸出來(lái)一個(gè)節(jié)點(diǎn),所以第二層的數(shù)據(jù)量是1170*1170=1368900,問(wèn)題在于第三層,因?yàn)閕nnodb的葉子節(jié)點(diǎn),是直接包含整條mysql數(shù)據(jù)的,如果字段非常多的話數(shù)據(jù)所占空間是不小的,我們這里以1kb計(jì)算,所以在第三層,每個(gè)節(jié)點(diǎn)為16kb,那么每個(gè)節(jié)點(diǎn)是可以放16個(gè)數(shù)據(jù)的,所以最終mysql可以存儲(chǔ)的總數(shù)據(jù)為
1170 * 1170 * 16 = 21902400 (千萬(wàn)級(jí)條)
其實(shí)計(jì)算結(jié)果與我們平時(shí)的工作經(jīng)驗(yàn)也是相符的,一般mysql一張表的數(shù)據(jù)超過(guò)了千萬(wàn)也是得進(jìn)行分表操作了。
總結(jié)
最后用一張圖片總結(jié)一下今天討論的內(nèi)容,希望您能喜歡
到此這篇關(guān)于淺談mysql一張表到底能存多少數(shù)據(jù)的文章就介紹到這了,更多相關(guān)mysql表存多少數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談SQLite時(shí)間函數(shù)的使用說(shuō)明與總結(jié)分析
本篇文章是對(duì)SQLite時(shí)間函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05mysql中varchar類型的日期進(jìn)行比較、排序等操作的實(shí)現(xiàn)
在mysql使用過(guò)程中,日期一般都是以datetime、timestamp等格式進(jìn)行存儲(chǔ)的,但有時(shí)會(huì)因?yàn)樘厥獾男枨蠡驓v史原因,日期的存儲(chǔ)格式是varchar,那么應(yīng)該怎么進(jìn)行比較和排序等問(wèn)題,本文就來(lái)介紹一下2021-11-11MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法
網(wǎng)上查到的grant方式大多會(huì)報(bào)錯(cuò),主要原因是MySQL版本8.0后不能再使用原來(lái)的方式,這篇文章主要介紹了MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000),需要的朋友可以參考下2022-08-08MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程
這篇文章主要為大家詳細(xì)介紹了MySQL基礎(chǔ)教程第一篇,mysql5.7.18安裝和連接教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05mysql中mydumper 和 mysqldump 對(duì)比使用
MySQL數(shù)據(jù)庫(kù)備份工具有其自帶的mysqldump,屬于mysql官方的一款備份工具。但是第三方備份工具mydumper憑借優(yōu)越的特點(diǎn)為更多人所使用。下面就通過(guò)測(cè)試驗(yàn)證它們之間的備份效率。2017-05-05innodb存儲(chǔ)引擎修改表共享空間為獨(dú)立空間
最近在優(yōu)化mysql innodb存儲(chǔ)引擎,把共享表空間轉(zhuǎn)換成獨(dú)立表空間,下面是詳細(xì)步驟2014-01-01Mysql8.0壓縮包安裝方法(詳細(xì)教程一步步安裝)
這篇文章主要給大家介紹了關(guān)于Mysql8.0壓縮包安裝方法,文中介紹的非常詳細(xì),Mysql安裝的時(shí)候可以有msi安裝和zip解壓縮兩種安裝方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07