久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL的數據行和行溢出機制是什么意思

142次閱讀
沒有評論

共計 2140 個字符,預計需要花費 6 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章給大家分享的是有關 MySQL 的數據行和行溢出機制是什么意思的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考。一起跟隨丸趣 TV 小編過來看看吧。

一、行 有哪些格式?

你可以像下面這樣看一下你的 MySQL 行格式設置。

MySQL 的數據行和行溢出機制是什么意思

其實 MySQL 的數據行有兩種格式,一種就是圖中的 Compact 格式,還有一種是 Redundant 格式。

Compact 是一種緊湊的行格式,設計的初衷就是為了讓一個數據頁中可以存放更多的數據行。

你品一品,讓一個數據頁中可以存放更多的數據行是一個多么激動人心的事,MySQL 以數據頁為單位從磁盤中讀數據,如果能做到讓一個數據頁中有更多的行,那豈不是使用的空間變少了,且整體的效率直線飆升?

官網介紹:Compact 能比 Redundant 格式節約 20% 的存儲。

Compact 從 MySQL5.0 引入,MySQL5.1 之后,行格式默認設置成 Compact。所以本文描述的也是 Compact 格式。

二、緊湊的行格式長啥樣?

MySQL 的數據行和行溢出機制是什么意思

你肯定曉得表中有的列允許為 null,有的列是變長的 varchar 類型。

那 Compact 行格式是如何組織描述這些信息的呢?如下圖:

MySQL 的數據行和行溢出機制是什么意思

每部分包含的數據可能要比我上面標注的 1、2、3 還要多。

為了給大家更直觀的感受和理解我只是挑了一部分展示給大家看。

三、MySQL 單行能存多大體量的數據?

在 MySQL 的設定中,單行數據最大能存儲 65535byte 的數據(注意是 byte,而不是字符)

但是當你像下面這樣創建一張數據表時卻發生了錯誤:

MySQL 的數據行和行溢出機制是什么意思

MySQL 不允許創建一個長度為 65535byte 的列,因為數據頁中每一行中都有我們上圖提到的隱藏列。

所以將 varchar 的長度降低到 65532byte 即可成功創建該表

MySQL 的數據行和行溢出機制是什么意思

注意這里的 65535 指的是字節,而不是字符。

所以如果你將 charset 換成 utf8 這種編碼格式,那 varchar(N) 中的 N 其實指的 N 個字符,而不是 N 個 byte。所以如果你像下面這樣創建表就會報錯。

MySQL 的數據行和行溢出機制是什么意思

假如 encode=utf8 時三個 byte 表示一個字符。那么 65535 / 3 = 21845 個字符。

四、Compact 格式是如何做到緊湊的?

MySQL 每次進行隨機的 IO 讀

默認情況下,數據頁的大小為 16KB。數據頁中存儲著數行。

那就意味著一個數據頁中能存儲越多的數據行,MySQL 整體的進行的 IO 次數就越少?性能就越快?

Compact 格式的實現思路是:當列的類型為 VARCHAR、VARBINARY、BLOB、TEXT 時,該列超過 768byte 的數據放到其他數據頁中去。

如下圖:

MySQL 的數據行和行溢出機制是什么意思

看到這里來龍去脈是不是很清晰了呢?

MySQL 這樣做,有效的防止了單個 varchar 列或者 Text 列太大導致單個數據頁中存放的行記錄過少而讓 IO 飆升的窘境且占內存的。

五、什么是行溢出?

那什么是行溢出呢?

如果數據頁默認大小為 16KB,換算成 byte:16*1024 = 16384 byte

那你有沒有發現,單頁能存儲的 16384byte 和單行最大能存儲的 65535byte 差了好幾倍呢?

也就是說,假如你要存儲的數據行很大超過了 65532byte 那么你是寫入不進去的。假如你要存儲的單行數據小于 65535byte 但是大于 16384byte,這時你可以成功 insert,但是一個數據頁又存儲不了你插入的數據。這時肯定會行溢出!

其實在 MySQL 的設定中,發生行溢出并不是達到 16384byte 邊緣才會發生。

對于 varchar、text 等類型的行。當這種列存儲的長度達到幾百 byte 時就會發生行溢。

六、行 如何溢出?

還是看這張圖:

MySQL 的數據行和行溢出機制是什么意思

在 MySQL 設定中,當 varchar 列長度達到 768byte 后,會將該列的前 768byte 當作當作 prefix 存放在行中,多出來的數據溢出存放到溢出頁中,然后通過一個偏移量指針將兩者關聯起來,這就是行溢出機制。

七、思考一個問題

不知道你有沒有想過這樣一個問題:

首先你肯定知道,MySQL 使用的是 B +Tree 的聚簇索引,在這棵 B +Tree 中非葉子節點是只存索引不存數據,葉子節點中存儲著真實的數據。同時葉子結點指向數據頁。

那當單行存不下的時候,為啥不存儲在兩個數據頁中呢?就像下圖這樣~。

單個節點存儲下,我用多個節點存總行吧!說不定這樣我的 B +Tee 還能變大長高(這其實是錯誤的想法)

這個錯誤的描述對應的腦圖如下:

MySQL 的數據行和行溢出機制是什么意思

那 MySQL 不這樣做的原因如下:

MySQL 想讓一個數據頁中能存放更多的數據行,至少也得要存放兩行數據。否則就失去了 B +Tree 的意義。B+Tree 也退化成一個低效的鏈表。

你可以品一下這句藍色的話,他說的每個數據頁至少要存放兩行數據的意思不是說 數據頁不能只存一行。你確確實實可以只往里面寫一行數據,然后去吃個飯,干點別的。一直讓這個數據頁中只有一行數據。

這句話的意思是,當你往這個數據頁中寫入一行數據時,即使它很大將達到了數據頁的極限,但是通過行溢出機制。依然能保證你的下一條數據還能寫入到這個數據頁中。

正確的腦圖如下:

MySQL 的數據行和行溢出機制是什么意思

感謝各位的閱讀!關于 MySQL 的數據行和行溢出機制是什么意思就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-18發表,共計2140字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 天水市| 英吉沙县| 蒲江县| 交口县| 石首市| 沅江市| 泰安市| 婺源县| 莆田市| 万荣县| 麟游县| 平阳县| 新竹市| 洪洞县| 花莲县| 德兴市| 神木县| 启东市| 武冈市| 桃园市| 河北省| 利辛县| 武鸣县| 宁南县| 同心县| 三河市| 乌拉特后旗| 黑龙江省| 宁化县| 车致| 清苑县| 图木舒克市| 廊坊市| 绥阳县| 延寿县| 兴义市| 高平市| 三穗县| 定州市| 天门市| 星座|