天天看點

Mysql InnoDB筆記(2)——表

本文筆記摘自于《Mysql 技術内幕 InnoDB存儲引擎》

Mysql InnoDB筆記(1)——體系架構

Mysql InnoDB筆記(2)——表

Mysql InnoDB筆記(3)——索引

Mysql InnoDB筆記(4)——鎖

Mysql InnoDB筆記(5)——事務

Mysql InnoDB筆記(6)——備份和性能調優

在InnoDB存儲引擎中,所有表都是根據主鍵順序存放的,如果沒有顯式定義非空的唯一索引,InnoDB會自動建立一個。

邏輯存儲結構

如下圖:

Mysql InnoDB筆記(2)——表

依次為:表空間(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)——索引

繼續閱讀