本文筆記摘自于《Mysql 技術内幕 InnoDB存儲引擎》
Mysql InnoDB筆記(1)——體系架構
Mysql InnoDB筆記(2)——表
Mysql InnoDB筆記(3)——索引
Mysql InnoDB筆記(4)——鎖
Mysql InnoDB筆記(5)——事務
Mysql InnoDB筆記(6)——備份和性能調優
表
在InnoDB存儲引擎中,所有表都是根據主鍵順序存放的,如果沒有顯式定義非空的唯一索引,InnoDB會自動建立一個。
邏輯存儲結構
如下圖:
依次為:表空間(tablespace)–>段(segment)–>區(extent)–>頁(page)–>行(row)
-
表空間(tablespace)
預設情況下,所有表資料都存放在一個共享表空間(ibdata1)裡,可以使用參數
innodb_file_per_table=ON
設定每張表使用單獨的表空間。
表空間剛申請的時候,如果建立的表資料小于1M,會先用32個頁大小的碎片頁來存放資料,使用完後才申請64個連續的頁。
-
段(segment)
常見的段有:資料段、索引段、復原段
-
區(extent)
區固定大小為1MB,預設的頁大小為16kb,即1個區有64個連續的頁。
-
頁(page)
頁是磁盤管理的最小機關 。可以通過
innodb_page_size
來配置頁的大小。
常見的頁類型有:
資料頁(B-tree Node)
undo頁(undo Log Page)
系統頁(System Page)
事務資料頁(Transaction system Page)
插入緩沖位圖頁(Insert Buffer Bitmap)
插入緩沖空閑清單頁(Insert Buffer Free List)
未壓縮的二進制大對象頁(Uncompressed BLOB Page)
壓縮的二進制大對象頁(compressed BLOB Page)
-
行(row)
InnoDB的資料都是按行存放的。
存放行記錄最多為16KB/2-200=7992行。
為什麼???
行記錄格式
-
Compact
Mysql 5.1版本開始預設的行格式,設計目的就是高效地存儲資料。
-
Redundant
Mysql5.0之前版本的存儲格式。
了解一下行溢出資料的概念
- Compressed
- Daynamic
Compact和Redundant屬于Antelope檔案格式
Compressed和Daynamic屬于Barracuda檔案格式
了解一下CHAR和VARCHAR的存儲差別
資料頁格式
由7個部分組成:
- File Header(檔案頭)
- Page Header(頁頭)
- Infimun和Supremun Records
- User Records(使用者記錄,即行記錄)
- Free Space(空閑空間)
- Page Directory(頁目錄)
- File Trailer(檔案結尾資訊)
限制
限制的種類:Primary Key、Unique Key、Foreign Key、Default、NOT NULL
ENUM、SET 、觸發器、外鍵,這些也是跟限制相關的,但實際項目中我們一般都不會使用。原因就是不好維護,或者影響性能。
視圖
視圖在實際項目中也很少用,我指的OLTP系統。别問為什麼,我想沒人會使用。
分區表
InnoDB自身支援水準分區,分區類型有以下幾種:
- RANGE分區
- LIST分區
- HASH分區
- KEY分區
- COLUMNS分區
并且支援子分區,允許在RANGE和LIST的分區上再做HASH或KEY分區。
并不建議使用InnoDB自身的分區,使用不當,會掃描所有分區 ,增加磁盤IO次數,并且是倍數增加,相當坑。
建議使用成熟的分表中間件,如mycat、cobar、sharding-jdbc等。
上一篇:Mysql InnoDB筆記(1)——體系架構
下一篇:Mysql InnoDB筆記(3)——索引