MySQL儲存引擎 InnoDB

2022-01-19 20:13:08 字數 1212 閱讀 1307

為什麼innodb不將總數存起來?

innodb直接count(*)會遍歷全表(沒有where條件),雖然結果準確,但會導致效能問題。

按照效率排序的話,count(字段)innodb一棵b+樹可以存放多少行資料?

這個問題的簡單回答是:約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先從innodb索引資料結構、資料組織方式說起。

在計算機中磁碟儲存資料最小單元是扇區,乙個扇區的大小是512位元組,而檔案系統(例如xfs/ext4)他的最小單元是塊,乙個塊的大小是4k,而對於我們的innodb儲存引擎也有自己的最小儲存單元——頁(page),乙個頁的大小是16k。

現在我們清楚了innodb中主鍵索引b+樹是如何組織資料、查詢資料的,我們總結一下:

1、innodb儲存引擎的最小儲存單元是頁,頁可以用於存放資料也可以用於存放鍵值+指標,在b+樹中葉子節點存放資料,非葉子節點存放鍵值+指標。

2、索引組織表通過非葉子節點的二分查詢法以及指標確定資料在哪個頁中,進而在去資料頁中查詢到需要的資料;

那麼回到我們開始的問題,通常一棵b+樹可以存放多少行資料?

這裡我們先假設b+樹高為2,即存在乙個根節點和若干個葉子節點,那麼這棵b+樹的存放總記錄數為:根節點指標數*單個葉子節點記錄行數。

上文我們已經說明單個葉子節點(頁)中的記錄數=16k/1k=16。(這裡假設一行記錄的資料大小為1k,實際上現在很多網際網路業務資料記錄大小通常就是1k左右)。

那麼現在我們需要計算出非葉子節點能存放多少指標,其實這也很好算,我們假設主鍵id為bigint型別,長度為8位元組,而指標大小在innodb原始碼中設定為6位元組,這樣一共14位元組,我們乙個頁中能存放多少這樣的單元,其實就代表有多少指標,即16384/14=1170。那麼可以算出一棵高度為2的b+樹,能存放1170*16=18720條這樣的資料記錄。

根據同樣的原理我們可以算出乙個高度為3的b+樹可以存放:1170*1170*16=21902400條這樣的記錄。所以在innodb中b+樹高度一般為1-3層,它就能滿足千萬級的資料儲存。在查詢資料時 一次頁的查詢代表一次io, 所以通過主鍵索引查詢通常 只需要1-3次io操作 即可查詢到資料。

mysql b+樹能存多少條資料?b+樹每層有多少分支?

MySQL的儲存引擎INNODB

1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...

mysql的innodb儲存引擎

innodb是支援事務的儲存引擎,支援acid特性的acid 指資料庫事務正確執行的四個基本要素的縮寫 包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 更適合處理大量的小事務,小事務正常都會被提交,很少會被回滾,在資料儲存的...

InnoDB 儲存引擎

innodb是事務型資料庫的首選引擎,支援事務安全表 acid 支援行鎖定和外來鍵。mysql 5.5.5 之後,innodb作為預設儲存引擎。innodb的主要特性有一下幾項。a.innodb給mysql提供了具有提交 回滾和崩潰恢復能力的事務安全 acid相容 儲存引擎。innodb鎖定在行級並...