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的謎團解開了