mysql一張表到底能存多少數據?

前言

程序員平時和mysql打交道必定很多,能夠說天天都有接觸到,可是mysql一張表到底能存多少數據呢?計算根據是什麼呢?接下來我們逐一探討mysql

知識準備

數據頁

在操做系統中,咱們知道爲了跟磁盤交互,內存也是分頁的,一頁大小4KB。一樣的在MySQL中爲了提升吞吐率,數據也是分頁的,不過MySQL的數據頁大小是16KB。(確切的說是InnoDB數據頁大小16KB)。詳細學習能夠參考官網 咱們能夠用以下命令查詢到。程序員

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

今天我們數據頁的具體結構指針等不深究,知道它默認是16kb就好了,也就是說一個節點的數據大小是16kbsql

索引結構(innodb)

mysql的索引結構我們應該都知道,是以下的b+樹結構 一般b+樹非葉子節點不存儲數據,只有葉子節點(最下面一層)才存儲數據,那麼我們說回節點,一個節點指的是(對於上圖而言)數據結構

每一個紅框選中的部分稱爲一個節點,而不是說某個元素。 瞭解了節點的概念和每一個節點的大小爲16kb以後,我們計算mysql能存儲多少數據就容易不少了學習

具體計算方法

根節點計算

首先我們只看根節點spa

好比咱們設置的數據類型是bigint,大小爲8b 在數據自己現在還有一小塊空間,用來存儲下一層索引數據頁的地址,大小爲6kb操作系統

因此咱們是能夠計算出來一個數據爲(8b+6b=14b)的空間(以bigint爲例) 咱們剛剛說到一個數據頁的大小是16kb,也就是(161024)b,那麼根節點是能夠存儲(161024/(8+6))個數據的,結果大概是1170個數據 若是跟節點的計算方法計算出來了,那麼接下來的就容易了。3d

其他層節點計算

第二層其實比較容易,由於每一個節點數據結構和跟節點同樣,並且在跟節點每一個元素都會延伸出來一個節點,因此第二層的數據量是1170*1170=1368900,問題在於第三層,由於innodb的葉子節點,是直接包含整條mysql數據的,若是字段很是多的話數據所佔空間是不小的,咱們這裏以1kb計算,因此在第三層,每一個節點爲16kb,那麼每一個節點是能夠放16個數據的,因此最終mysql能夠存儲的總數據爲指針

1170 * 1170 * 16 = 21902400 (千萬級條)code

其實計算結果與咱們平時的工做經驗也是相符的,通常mysql一張表的數據超過了千萬也是得進行分表操做了。

總結

最後用一張圖片總結一下今天討論的內容,但願您能喜歡

相關文章
相關標籤/搜索