200_mysql_innodb_1_ Row_Format _page_聚簇_二級索引
前言;
1 Innodb 核心特性
MVCC : 多版本并發控制
聚簇索引 : 用來組織存儲數據和優化查詢
支持事務 : 數據最終一致提供保證
支持行級鎖 : 并發控制, 保障 寫 – 寫之間的控制,保障一致性
外鍵 : 多表之間的數據一致一致性 多緩沖區支持
自適應Hash索引: AHI 復制中支持高級特性。
備份恢復: 支持熱備。
自動故障恢復:CR Crash Recovery
雙寫機制 : DWB Double Write Buffer
2 查詢版本
#客戶端版本 Mysql -V #server 版本 select @@version; engine 版本: SELECT * FROM information_schema.plugins; SELECT @@innodb_version;
一 宏觀結構
8.0 以前 InnoDB表: ibd數據和索引;? frm :存私有的數據字典信息; ?ibdataN:系統的數據字典信息
8.0 之后只有ibd數據和索引+ 冗余的SDI私有數據字典信息 (對DDL有好處) SDI(每個表的表空間自行管理json格式的私有數據字 典信息,用來替換frm的。)
mysql.ibd ---> 整個系統的數據字典,不再放在ibdata1
二 微觀物理結構
2.1 innodb記錄存儲結構
Innodb數據頁16KB (show variables like "innodb_page_size";? #16384 16KB) 一次至少從磁盤讀取16KB到內存,一次最少刷新16KB內容到磁盤
2.2 Innodb 行格式 Row_Format (Redundant Compact Dynamic Compressed)
show variables like "%Row_Format%" # innodb_default_row_format dynamic create table xxx() ROW_FORMAT=DYNAMIC
2.3 行格式的機構
1 記錄額外的信息 (132字節)
變長字段長度信息:? 列表形式 存儲所有可變長度字段(varchar TEXT)的真實數據(非NULL)占用的字節數 (逆序存放)
NULL值列表: 二進制表示 1為null,0位非null (先判斷表約束,然后根據實際情況 逆序存放 最終轉成16進制)
記錄頭信息:5個字節(40個二進制位)組成 描述該記錄的屬性
名稱
大小(bit)
沒有使用
沒有使用
標記該記錄是否被刪除,0 表示未刪除,1表示刪除,
B+樹的每層非葉子節點中的最小記錄都會添加該標記 (只有目錄項_非葉子節點存儲此信息 1 表示,其它是0)
表示當前記錄擁有的記錄組數 帶頭大哥的組數為實際組數,小弟為0
表示當前記錄在記錄堆的位置信息 (user records中heap一條條親密無間排列的結構,每條記錄在heap中的位置heap_no)
表示當前記錄的類型,0表示普通記錄,1表示B+樹非葉子節點(目錄項)記錄,2表示Infimum最小記錄,3表示Supermum最大記錄
表示下一條記錄的相對位置
備注:
記錄可以比大小,比的是主鍵
無論插入多少條記錄,最小是Infimum (5字節記錄頭+8字節固定單詞), 最大是Supremum
Next record 當前記錄到下一條記錄的真實距離(理解為偏移量/指針 正數代表在下一條記錄后面,負數代表前面, -111代表向前找111個字節)
無論對數據的增刪改,innodb始終維護一個單項鏈表(鏈表各個節點由主鍵從小到大順序鏈接)
頁面前面的記錄heap_no小,后面大,從2開始, 0-Infimum;1-Supremum最靠前
2 真實記錄數據
Row_id 6字節 ,行ID 唯一表示一條記錄 ?非剛需,無主鍵情況下生成(無顯示定義,可以選not null & UNIQUE的鍵)
Trx_id 6 字節 ? ??事物ID 剛需
Roll_pointer 7字節 回滾指針
溢出列
某列超出數據頁范圍 需在其他頁面存儲,其它頁面即為溢出列(COMPACT&REDUNDANT格式 會存儲真實記錄的 768字節,再拿20字節存儲其它位置的指針等信息)
溢出頁臨界點(Mysql中規定,一個也至少存兩行記錄 每行記錄真實數據的屬性信息27字節) 132+2(27+n)< 16384 , n <8099 情況下不會有溢出列
DYNAMIC格式不會單獨記錄真實數據的前768個字節,僅拿20字節存儲溢出頁/列的位置
三 Innodb數據頁結構
InnoDB存放不同數據頁設計不同類型的頁, 例如 index 頁 Change buffer頁,Inode頁,undo頁, 通用結構如下
3.1 Page Directory
Select * from xxx where id = xxx不會從infimum開始遍歷,innodb會設計一種 類似書的目錄結構,
將正常記錄分成幾組(包括infimum & supremum)
每組最后一條也是最大記錄是帶頭大哥,其余數據屬于這位大哥(n_owned=0)
帶頭大哥在頁面中的偏移量(實際位置到第0個字節距離)取出,放在整改頁的尾部(page directory) 這些偏移量成為槽 slot(每個slot2字節,相鄰分布,越小越接近File Trailer)
Infimum所在組只能有1條記錄,supremum所在組 1-8條, 剩下正常組 4-8條
3.2? PageHeader 記錄數據頁中的狀態信息 例如 Free space 偏移量,slot個數等
3.3 File header (文件頭部信息 記錄數據頁記錄的各種狀態)
當MySQL版本小于MySQL-4.0.14,該值代表該頁所在表空間ID ,之后該值代表頁的checksum值(一種新的checksum值)。
頁號 (單獨頁號類似身份證)
上一個頁號 ?雙向鏈表
下一個頁號 B+Tree特性決定了葉子節點必須是雙向列表
頁面最后被修改后修改時候的LSN(Log Sequence Number)
該值僅在系統表空間的第一頁中定義,代表文件至少被更新到了該LSN值
該值代表頁屬于哪個表空間
數據頁類型
類型名稱
十六進制
描述
FIL_PAGE_TYPE_ALLOCATED
0x0000
最新分配,還沒使用
FIL_PAGE_UNDO_LOG
0x0002
Undo 日志頁
FIL_PAGE_INODE
0x0003
存儲斷的信息
FIL_PAGE_IBUF_FREE_LIST
0x0004
Change Buffer空閑列表
FIL_PAGE_IBUF_BITMAP
0x0005
Change Buffer 的一些屬性
FIL_PAGE_TYPE_SYS
0x0006
存儲一些系統數據
FIL_PAGE_TYPE_TRX_SYS
0x0007
事務系統數據
FIL_PAGE_TYPE_FSP_HDR
0x0008
表空間頭部信息
FIL_PAGE_TYPE_XDES
0x0009
擴存儲區的一些屬性
FIL_PAGE_TYPE_BLOB
0x000A
溢出頁
FIL_PAGE_INDEX
0x45BF
索引頁,也就是數據頁
3.4 File Trailer (文件尾部) 為了檢測頁是否已經完整地寫入磁盤(如可能發生的寫入過程中磁盤損壞、機器關機等)
8個字節組成 ?分成2部分
前四個字節 代表也的校驗和 通File Header中的校驗和對應
后四個字節 代表頁面被最后修改時 對應的LSN的后四個字節 同FILE_PAGE_LSN后四個字節相同
四 Innodb存儲引擎索引_B+樹索引
表在插入過程中,分配的數據頁不一定是連續的,由于主鍵索引從小到大排序,所以會有頁的分裂產生,為了快速查找,制作目錄(非葉子節點)
頁的用戶記錄中最小的主鍵值 作為key
頁號 用page_no 表示
B+ 樹的根節點自創建日后不再移動
聚簇索引 主鍵的大小作為頁和記錄的排序規則, 葉子節點記錄包含表中所有列
二級索引(輔助索引) 索引列(字段)的大小作為頁和記錄排序規則, 葉子節點存儲的是索引列和主鍵
MyISAM 存儲引擎的數據和索引分開存儲, 索引均為二級索引,葉子節點存儲的是列+行號
4.1 聚簇索引 使用主鍵的大小作為頁和記錄的排序規則
頁(包括葉子節點和內節點) 內的記錄安裝主鍵大小排序 –> 單向鏈表
各存放用戶記錄的頁節點也根據用戶記錄的主鍵大小排序 –> 雙向鏈表
存放目錄項的頁 層級不同,同層級中頁也是根據目錄項的主鍵大小排序 –>雙向鏈表
B+樹的葉子節點存儲完整用戶記錄包括隱藏列
4.2 二級索引 單獨一顆B+數 葉子節點存儲列和主鍵ID以及頁號
如果聯合索引a1 a2 a3 會先按a1排序,a1相同a2排序,a2相同a3排序, 再對應主鍵(順序打亂,隨機IO)
創建索引
alter table t1 add index idx_k2(k2);
alter table t1 add index idx_k1_2(k1,k2);
alter table city add index idx_n(name(5));? # 前置索引
alter table city drop index idx_n
MySQL 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。