讀書筆記-《MySQL技術內幕-InnoDB存儲引擎》-4~6章

第四章:表

表都是根據主鍵順序存放的,即索引組織表。

使用第一個定義的非空唯一索引作爲主鍵,如果沒有則創建一個6字節的指針。

邏輯存儲:表空間(tablespace)、段(segment)、區(extent)、頁(page)、行(row)。

段:由引擎自身管理,與Oracle自動段空間管理類似。在開始時先用32個碎片頁來存儲數據,而後纔是64個連續頁的申請。對於小表或是undo段可減少空間消耗。

區:大小恆爲1MB。默認包含64個連續頁,每個頁大小16KB(16384字節)。

頁:常見類型爲數據頁、undo頁、系統頁、事務數據頁。每個頁最多存放16KB / 2-200 = 7992 行記錄。

 

Barracuda File Format 包括 Antelope、Compressed、Dynamic,Antelope 包括 Compact、Redundant。

新的行記錄格式Compressed、Dynamic,行溢出時僅在數據頁存放20字節的指針。Compressed使用zlib算法壓縮行數據,特別適合blob、text、varchar。

Compact

變長字段長度列表 NULL標誌位 記錄頭信息

列1

除了用戶定義還包括

事務ID列、回滾指針列

列2

如果沒有主鍵

還會有個rowid指針

……

表結構爲

t1 varchar(10)

t2 varchar(10)

t3 char(10)

t4 varchar(10)

未設置主鍵

單字節latin1編碼

 

插入兩條數據

('a', 'bb', 'bb', 'ccc')

('d', NULL, NULL, 'fff')

第一條記錄

03 02 01 // 倒序 varchar 的真實長度

00 // NULL標誌位 第一條記錄沒有NULL

00 00 10 00 2c // 記錄頭信息,0x2c爲下一條記錄的偏移量,即當前記錄+偏移量 = 下條記錄起始位置

00 00 00 2b 68 00 // 沒有主鍵產生的指針

00 00 00 00 06 05 // 事務ID

80 00 0000 32 01 10 // 回滾指針列

61 // a

62 62 // bb

62 62 20 20 20 20 20 20 20 20 // bb 空餘的用20填充

63 63 63 // ccc

第二條記錄

03 01 // 同左

06 // 存在NULL值

00 00 20 ff 98 // 同左

00 00 00 2b 68 02 // 同左

00 00 00 00 06 07 // 同左

80 00 00 00 32 01 10 // 同左

64 // d

66 66 66 // fff

Redundant:與Compact類似,不過Char類型的NULL值會佔用空間。

多字節字符集(UTF-8)的情況下,char與varchar的實際行存儲沒有區別。

外鍵約束:保證數據的完整性和一致性。但目前主流的環境是數據庫結構經常變動、性能要求高,導致現在的設計原則是,將關係交給業務層來維護。

分區:MySQL支持的類型爲水平分區(按行記錄拆分)、局部分區(將數據和索引放一起)。

MySQL的分區方式:Range(行數據屬於一個給定連續區間的記錄被放入分區)、List(與Range類似,不過是離散的值)、Hash(根據用戶自定義的表達式返回值來分區)、Key(通過MySQL提供的Hash函數來分區)。

分區的意義在於減少不必要的分區的檢索,反之如果設計不當,總是查詢所有的分區反而會增加大量IO次數降低效率。

(分區、分表、索引:三者並不衝突,可以同時使用。分區強調歸檔整理,同時提高效率;分表和分區類似,將實現方式交由自己控制;索引與分區沒什麼關係,都是交由MySQL實現)

第五章:索引與算法

這裏直接展示圖片。依次可以看到僅有聚集索引(主鍵)時表的邏輯存儲方式、有聚集索引和輔助索引時的邏輯存儲方式、聯合索引的邏輯存儲方式。

繼續展示圖片:關於B-tree 與 B+tree

二分查找法 - 二叉查找樹 - 平衡二叉樹 - 多路查找樹 - B+tree

DML(Database Manipulation Language) 數據庫表數據操作語言 Insert,Delete,Update,Truncate
DDL(Database Definition Language) 數據庫表結構操作語言 Create,Alter
DCL(Database Control language) 數據庫權限控制操作語言 Grant,Remove
DQL(Database Query Language) 數據庫表數據查詢語言 Select

聚集索引:InnoDB爲索引組織表,即聚集索引按照每張表的主鍵構造一棵B+tree,同時葉子結點中存放的整張表的行記錄數據。

由於數據頁只能按照一棵B+tree樹進行排序,所以每張表只能有一個聚集索引(主鍵)。

輔助索引:其葉子結點包含鍵值和指向對應行數據的聚集索引的指針。

Cardinality:不重複記錄數量的預估值,如果Cardinality / n_rows_in_table 越接近1(即越趨近於每條記錄的該字段都不重複),該字段開啓索引越有價值。

第六章:鎖

待學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章