mysql 表的建立時間一直在表 MySQL 表

2021-10-18 21:40:42 字數 2439 閱讀 3447

本章將描述 innodb 儲存引擎中資料在表中是如何組織和存放的,這是關係型資料庫模型的核心。

前面提到,innodb 儲存引擎都是根據主鍵組成的,即使沒有顯式地建立主鍵,innodb也會選擇或者建立主鍵,這種儲存方式稱為索引組織表。

當建立表沒有顯示定義主鍵,innodb 儲存引擎主鍵確定方式:

innodb 儲存引擎中,所有的資料都被邏輯的存放到乙個空間,被稱為表空間(tablespace)。表空間又由段(segment)、區(extent)、頁(page)組成,innodb 儲存引擎的邏輯儲存結構如下圖所示:

表空間是 innodb 儲存引擎邏輯結構的最高處,所有資料都存放在表空間中。預設情況下innodb只有乙個共享表空間 ibdata1,即所有的資料都存放在這個表空間中。如果使用者啟用了innodb_file_per_table,則每張表內的資料可以單獨放到乙個表空間內。需要注意的是,如果啟用了innodb_file_per_table 引數,每張表的表空間內存放的只是資料、索引和插入緩衝 bitmap 頁,其他類的資料,如回滾資訊,插入緩衝索引頁、系統事務資訊,二次寫緩衝等還是存放在原來的共享表空間內。所以即便開啟了 innodb_file_per_table 之後,共享表空間還是會不斷增大的。

表空間由各個段組成,如資料段、索引段、回滾段等。innodb 儲存引擎是索引組織表,資料即索引,故資料段即為 b+ 樹葉子節點,索引段即為 b+ 樹非葉子節點。innodb 儲存儲存引擎中段的管理是儲存引擎自身完成的,無需人工管理。

區是連續頁組成的空間,乙個區的大小為 1mb,預設情況 innodb 儲存引擎頁的大小為16kb,即乙個區一共有 64 個連續的頁。為了保證區的連續性,innodb 儲存引擎每次從磁碟申請 4~5 個區。

innodb 儲存引擎中頁是磁碟管理的最小單位,頁大小一經設定不可以對其再次修改,常見的頁型別有:

innodb 儲存引擎是面向列的(row-oriented),即資料按行存放,每頁存放的行記錄頁是有硬性定義的。最多允許存放 16k/2-200 行的記錄,即 7992 行記錄。

頁是 innodb 儲存引擎管理資料庫最小的磁碟單位,頁型別為 b-tree node 的頁存放的是表中行的實際資料。

如上圖所示,innodb資料頁由七個部分組成:

file header、page header、file trailer的大小是固定的,用來標示該頁的一些資訊。其餘部分為實際的行儲存空間,因此大小是動態的。

innodb 儲存引擎資料記錄是以行的形式儲存的,頁中儲存著表中的一行行資料。innodb 儲存引擎提供了 compact 和 redunant 兩種格式來儲存行記錄,預設是 compact 行格式,redundant 格式是為了相容之前版本。

compact 行記錄格式是 mysql 5.0 引入的,設計目的是高效儲存資料,簡單的說,乙個頁中能存放的行記錄越多,其效能就越高。

compact 行記錄格式首部是乙個非 null 的變成字段列表,並且是按照列的順序逆序放置的。其長度為:若列的長度小於 255 位元組,用 1 位元組表示;若列的長度大於 255 個位元組,用 2 位元組表示。變長字段長度列表之後的部分是 null 標誌位,標識該行記錄中是否有 null 值,該部分占用 1 位元組長度。第三步部分是記錄頭資訊,固定占用 5 位元組(40 位),每位含義如下:

最後部分就是實際儲存每個列的資料,其中 null 不占用該部分空間,而且每行記錄除了使用者定義的列外還有兩個隱藏列,事務 id 列和回滾指標列,分別是 6 位元組 和 7 位元組大小,如果沒有顯式定義主鍵,每行還會增加乙個 6 位元組的 _rowid 列。

innodb 儲存引擎可以將一條記錄中的某些資料存放在真正的資料頁之外,一般是 blob、lob 這類大物件列型別。但是這樣理解是比較粗暴的,blob 也可以不把資料放到溢位頁,而且即便是 varchar 列資料型別頁也可能被存放到行資料溢位頁。我們知道 innodb 儲存引擎是索引組織表,即 b+樹結構,如果讓 b+ 樹索引有意義,那麼乙個資料頁應該至少存在兩條行記錄,即如果資料頁大小為 16k(16384位元組),那面至少每條行記錄小於 8192 位元組才可能存放到資料頁,實際測試是 varchar 列資料型別存放溢位頁長度閾值為 8098位元組。

innodb 1.0.x 版本開始引入了兩種新的行記錄格式:compressed 和 dynamic,這兩種資料格式在存放 blob 列資料型別時採用完全的行溢位方式。compressed 行記錄另乙個功能是儲存在其中的資料會以 zlib 演算法壓縮,可以更有效儲存大字段資料型別。

一直在流浪

人生是一場旅途,我們一直在流浪。沿途的美景轉瞬即逝,唯有往事如影隨行。總在平衡,追蹤夢裡的畫面,現實還是幻覺,誰又能察覺?迷一樣的歲月,在旅途中丟失方向。茫然若失的不知所措,驚慌失措的無計可施。揮一揮拳頭,砸向深邃的夜空,迷茫的心境。總是努力不敢如此窘迫,而事實卻總是出乎意料的背道而馳,難道命硬的人...

雜談 學習一直在路上

部落格已經有一段時間沒有更新。江湖依舊在,心態有些懈怠,需要收拾心情,我要好好看風景。工作近來相對輕鬆,也就有了更多學習的時間。雖然部落格停更了一段時間,但是在我自己的mediawiki上仍在耕耘,只是大多是付費課程的筆記,放在網上就不厚道,不亦樂乎之後,部落格也就暫時放下。推薦一下極客時間,都是一...

設計模式 一直在更

一 單例模式 參考部落格 單例模式指的是 由該類來產生該類的物件,且確保只有單個物件被建立!懶漢式 多執行緒不安全 classa private static a instance public static a getinstance 改進懶漢式 多執行緒安全 單執行緒高效 classc priv...