InnoDB 的表結構

2021-08-02 09:25:41 字數 1743 閱讀 8153

innodb是索引組織表,這種結構的儲存是根據主鍵順序組織的。innodb要求每張表都必須有乙個主鍵,如果沒有innodb會自己確定或新增乙個主鍵

innodb的主鍵索引也稱為聚集索引,是乙個核心的索引,聚集索引採用b+ 樹結構,每個索引項都包含了row資料,也就是通過索引可以定義到具體的row資料,無需二次io。

主鍵是索引組織表的核心,表資料按照主鍵順序儲存,innodb的主鍵確定過程如下:

innodb基於表空間、段、區、頁、行來組織資料。乙個表空間包含多個段,每個段儲存了不同型別的資料,如資料段、索引段。每個段由多個區構成,每個區有多個頁,頁是記憶體池中的基本管理單位,也是索引的基本單位,每個頁包含多個行,行就是資料和核心。

由於innodb 資料行的儲存格式的特點,innodb支援的varchar最大為65535位元組,但是由於還需要儲存其他元資訊,實際上varchar最大為65532位元組,而且65535是所有varchar欄位的總和,如果總和超過了該大小,需要使用text或者blob,某些sql級別下innodb會自動轉換。

還有就是如果每頁資料存放不了2 row資料,則會出現行溢位現象,資料溢位會增大磁碟io,所以varchar欄位的總長度不要超過8098。

如果varchar太長,innodb建立時會使用text或者blob替換,但是text、blob類似指標方式儲存,這也會加大磁碟io,效率會下降。

char欄位的單位是字元,表象上是固定長度,但是儲存時也是一種另類的varchar,varchar的單位是位元組,要注意區別,也就是char(2)在不同字符集下,ab和『我們』都是一樣儲存的。

約束是資料庫的重要特徵,innodb支援如下幾種約束方式:

約束的建立方式:

sql 語句

create

table xx (

aa int de****t 1,

bb varchar(800) not

null,

'***' enum('1','0'),#不建議使用

uniquey key(bb) ,

primary

key (aa)

)engine = innodb;

alert table xx add unique key idx_xx(aa);

crete index idx_xx on xx (aa);

create

unique index idx_xx on xx (aa);

# 觸發器 trigger

create

trigger tr_aa

on xx for

each

rowbegin

....

end

ps :

建立約束的同時基本上就等於建立了索引,但是索引更偏向物理上、效能上的優化,約束是邏輯上、業務上的完整性;

* 約束並不一定報錯,要設定sql_mode 為 strict_trans_tables;*

* 每個表最多建立6個觸發器 *。

myisam不支援外來鍵和事務。

innodb和myisam、ndb都可以支援分割槽,但是有些儲存引擎是不支援的。分割槽操作常見於程式性分割槽,資料庫僅僅支援水平分割槽,不支援垂直分割槽。

垂直拆分:按照column拆分,拆分熱點字段。

mysql僅僅支援區域性分割槽,也就是資料、索引在一起,不支援全域性分割槽,全域性分割槽要求,資料分開,但是索引不分開。

Innodb 表結構學習

眾所周知,innodb主鍵聚集索引,index organized table 那麼沒有主鍵的時候,找非空唯一索引,或者自動建立6byte大小的指標,但是它自動建立的索引你是沒辦法拿來做主鍵過濾的 非空唯一索引如果有多個,按照 定義 順序選擇第乙個 select rowid from talbe 其...

innodb表空間儲存結構

儲存結構 innodb的邏輯儲存結構如圖所示 其空間管理由段,區和頁構成。段包括葉子節點段,即所有索引的葉子節點都儲存在這個段裡,葉子節點儲存資料 次級索引是主鍵 和鍵值,這可以方便管理並且減少隨機io 還包括非葉子節點,儲存的是指向另外節點的指標和鍵值 回滾段儲存的是每個表的undo日誌 具體分析...

學習筆記 InnoDB表和索引結構

mysql把 表的資料詞典資訊以.frm檔案的形式存在資料庫目錄裡,所有mysql儲存引擎都是這樣的。但是每個innodb表在表空間內的innodb內部資料詞典裡也有它自己的條目。當mysql移除表或資料庫,它不得不刪除.frm檔案和innodb資料詞典內的相應條目。這就是為什麼你不能在資料庫之間簡...