Innodb 表結構學習

2021-06-23 00:34:07 字數 2080 閱讀 3499

眾所周知,innodb主鍵聚集索引,index organized table

那麼沒有主鍵的時候,找非空唯一索引,或者自動建立6byte大小的指標,但是它自動建立的索引你是沒辦法拿來做主鍵過濾的;

非空唯一索引如果有多個,按照「定義」順序選擇第乙個

select _rowid from talbe; 其中_rowid幫你看到主鍵值,當然了,如果主鍵為多個列,這招不好使,你不如show create talbe ~~~

innodb的邏輯儲存組織形式為: tablespace-->segement-->extent-->page-->row

tablespace

這個tablespace主要是ibdata1,就是這個名字,你肯定能找到,預設情況下,就這乙個檔案,所有表資訊都在裡面了

但是,如果你innodb_file_per_table on,那麼檔案就多了,名字往往是ib_logfile*,因為你看名字也知道,這是讓每個表單獨存放,不過這時候ibdata1還是有重要作用,它叫共享表空間

那麼idbdata1此時什麼作用呢?

ib_logfile*(每個表自己的空間):資料(跟主鍵索引一塊兒),索引(輔助索引那些),插入緩衝bitmap

ibdata1(共享表空間)                :undo資訊,插入緩衝索引頁,系統事務資訊,double write buffer等

尤其是undo資訊放共享表裡,這個表分分鐘大小會變化,因為你要寫undo日誌啊

這裡插播一條:插入緩衝的介紹

主鍵聚集索引***,索引跟資料一起放的,那麼其他索引只好放到索引頁去了;

那麼我要往輔助索引頁裡面寫東西,這些索引頁我不能全放在記憶體中,如果每個要被寫入的索引頁我都主動把它讀進記憶體,這代價太大;

於是我們等著這些索引頁在記憶體的時候再往裡寫好了,於是我們搞乙個buffer,插入的東西放裡面等著,一旦有需要被寫入的索引頁被讀入記憶體了,我們趁機把buffer裡的東西寫進去,你說這多好,就是這樣;

但是注意如果是唯一非空索引頁,那你就必須檢查你要插入的索引是不是唯一的,這時候就不能用插入緩衝這一招了

segement

資料段:聚簇索引嘛,資料段就是b+樹的葉子節點咯,放的都是資料

索引段:非葉子節點放這邊,原來b+樹的非葉子就是索引

回滾段:後面再說

extent

這東西中文叫「區」,好多湊一塊叫乙個segment;extent裡面放了好多page

extent的大小永遠是1m;innodb為了保證extent是連續的,一般申請的時候都是申請4~5個

對於innodb,page預設大小是16k,引數innodb_page_size可以改預設,變成4k,8k這樣;

以下是乙個有意思的實際應用情況:

用了innodb_file_per_talbe之後啊,你建立乙個表,預設大小是96k,為什麼不直接給乙個extent這樣就1m了呢?

這是innodb為了節省空間做的乙個策略,就是你搞個小表(砸)或者undo這類的小段,分給你1m太浪費了;所以innodb準備了一些碎片page,你用乙個段之前,我先給你32個碎的page,這些要是不夠用了,我就知道你不是個小表了,那麼我就給你1m用

不過實際過程中,32個page似乎算的是「資料segment"有多少,《mysql技術內幕》中做了乙個實驗,大概是資料段的頁超過32個時,此時碎片頁用完,然後開始用連續的64個頁進行分配,此時檢視表的大小,應該是1m的整數倍了

page

對於頁的大小,新版本的innodb是可以進行設定的,但是一旦設定之後則不能更改,表中所有頁的大小均為所設的值,除非通過mysqldump進行匯入匯出操作

頁型別有:資料頁,undo頁,系統頁,事務資料頁,插入緩衝點陣圖頁,插入緩衝空閒列表頁,未壓縮的二進位製大物件頁,壓縮的二進位製大物件頁

row

innodb引擎儲存是面向row的,也就是資料是一行一行儲存的,也有按照列儲存的引擎,但是我們不去管,只看innodb

實際上innodb存放行資料有兩種格式compact和redundant,但是後者只是為了相容舊版本,老東西了沒意思

compact儲存方式長下圖這個樣

我們想要高效地儲存資料,什麼是高效?就是乙個頁裡放盡可能多的資料

List Entry鍊錶結構學習

鍊錶的使用 鍊錶是驅動開發中經常遇到的乙個資料結構,主要是雙向迴圈鍊錶 要使用鍊錶,需要用到乙個list entry的結構,其定義如下 typedef struct list entry list entry,plist entry 在實際的程式設計中,我們需要自己定義鍊錶的節點,並把節點的第乙個成...

資料結構學習 鍊錶結構

儲存結構定義 struct node typedef struct node ptrtonode typedef ptrtonode list typedef ptrtonode position struct node 書寫 package thedatastructureaboutlinked ...

InnoDB 的表結構

innodb是索引組織表,這種結構的儲存是根據主鍵順序組織的。innodb要求每張表都必須有乙個主鍵,如果沒有innodb會自己確定或新增乙個主鍵 innodb的主鍵索引也稱為聚集索引,是乙個核心的索引,聚集索引採用b 樹結構,每個索引項都包含了row資料,也就是通過索引可以定義到具體的row資料,...