第四章:表
表都是根據主鍵順序存放的,即索引組織表。
使用第一個定義的非空唯一索引作爲主鍵,如果沒有則創建一個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(即越趨近於每條記錄的該字段都不重複),該字段開啓索引越有價值。
第六章:鎖
待學習