1. 程式人生 > 其它 >mysql儲存結構

mysql儲存結構

表空間

共享表空間     獨立表空間

https://www.cnblogs.com/wt645631686/p/8258070.html  

偷一手,先貼個連結 感謝這位爺

innodb_file_per_table 引數設定是否開啟獨立表空間

開啟獨立表空間  每個表會有一個.idb檔案用於儲存資料

同時在共享表空間裡面 會放一些該表的其他資訊

如果啟用了innodb_file_per_talbe引數,需要注意的是每張表的表空間記憶體放的只是資料、索引和插入緩衝Bitmap頁,其他資料如:回滾資訊、插入緩衝索引頁、系統事物資訊、二次寫緩衝(Double write buffer)等還是放在原來的共享表空間內。同時說明了一個問題:即使啟用了innodb_file_per_table引數共享表空間還是會不斷的增加其大小的。

https://www.cnblogs.com/shamo89/p/8664982.html

獨立表空間的優缺點   大概看一下,並不理解

innodb_file_per_table

獨立表空間是否開啟的引數

段  區  頁

資料段 b加樹的葉子節點

索引段 b加樹的非葉子節點    具體頁不懂  先記一下   還有回滾段  大概是用於undo的

區由連續的頁組成  大小固定為1MB

頁的最大行數為   page_size    一般為 16KB 

16KB/2 - 200=7992

這個沒找到詳細的推理過程   我猜測   將一個表的所有隱藏列刪除  只剩下一個主鍵  

然後 根據編碼集合 給他來了個兩位元組大小的型別 比如 int16  還有兩百位元組要儲存一些其他東西

晚網上偷了一個圖   但是其他資訊加起來也只有128位元組

又查了一下   最大行數和頁大小無關   上面那些猜測全是錯的   最大行數7992 是規定  硬性規定

關於varchar

首先 varchar 在磁碟中和在記憶體中的區別

因為varchar 在磁碟中 記錄的是真實長度+額外資訊  比如 長度  innodb用兩個位元組儲存長度 所以 varchar型別的最大長度是 2的16次方-1 位元組  注意單位是位元組

varchar型別在記憶體中佔據的是實際宣告的長度,猜測是更新資料時,不確定資料長度,需要按照宣告長度給位置,不然位置不夠造成頁分裂之類的更麻煩

同時 宣告的varchar型別欄位長度單位的字元  這跟編碼集有關  例如 utf8mb4 一個字元長度為4個位元組   所以 varchar最大長度大約是  2的16次方除以四   比這個理論數稍微小一些,

因為還要額外存一些資訊

再次值得一提,varchar長度指的是所有變長欄位列加起來的和  ,不是單個欄位的長度

compact 行記錄格式

變長欄位長度列表(一個或兩個位元組。小於255一個位元組,大於255兩個位元組)//null標誌位//記錄頭資訊//列1//列2.。。

 變長欄位表  列的逆序

變長欄位長度表的儲存方式給我整蒙了,怎麼算數量都不對,tnnd

還有行溢位現象

但是有個問題 ,在硬碟只記錄實際長度,如果varchar 欄位 更新,長度從5變成500,會在磁碟中造成頁分裂或其他問題?是怎麼解決的呢?等待學習

varchar在記憶體中佔宣告長度,在磁碟中佔實際長度,

頁內部通過連結串列結構串聯各個行記錄。

compact的行記錄格式

記憶體中的記錄頁在磁碟中是連續的嗎?

一頓狂查 找到了這麼一句話 

innodb資料頁結構

user records,free space,page directory 這些部分為實際行記錄儲存空間,因此大小是動態的。  出自mysql 技術內幕  第 120 頁  最下面

指的是頁大小是動態還是其他的。

我認為指的是頁大小是動態的,例如 一個頁在物理磁碟上大小是 9KB

但是varchar宣告的長度比較長   在記憶體中處理後變成了16KB

但是如果資料更新後大小為14KB,這麼處理呢?

至少把varchar的謎團解開了