innodb將資料劃分為若干個頁,以頁作為磁碟和記憶體之間互動的基本單位,innodb中頁的大小一般為 16kb。也就是在一般情況下,一次最少從磁碟中讀取16kb的內容到記憶體中,一次最少把記憶體中的16kb內容重新整理到磁碟中。
乙個資料行中分為記錄的額外資訊和記錄的真實資料兩部分
記錄的額外資訊 包括變長字段長度列表/null值列表/記錄頭資訊把所有變長字段的真實資料占用的位元組長度都存放在記錄的開頭部位,從而形成乙個變長字段長度列表,各變長欄位資料占用的位元組數按照列的順序逆序存放。變長字段長度列表中只儲存值為 非null 的列內容占用的長度,值為 null 的列的長度是不儲存的真實資料就是各列的資料值
null值放到存貯真實資料的地方很佔記憶體,所以統一管理起來放到額外資訊的null值列表中,將每個允許儲存null的列對應乙個二進位制位,二進位制位按照列的順序逆序排列,二進位制位的值為1時,代表該列的值為null。二進位制位的值為0時,代表該列的值不為null。null值列表必須用整數個位元組的位表示,如果使用的二進位制位個數不是整數個位元組,則在位元組的高位補0。
innodb表對主鍵的生成策略:優先使用使用者自定義主鍵作為主鍵,如果使用者沒有定義主鍵,則選取乙個unique鍵作為主鍵,如果表中連unique鍵都沒有定義的話,則innodb會為表預設新增乙個名為row_id的隱藏列作為主鍵索引頁即上文所說的16kb
nextrecord屬性在頁中根據主鍵構造乙個單鏈表,根據主鍵遞增
如果順序遍歷單鏈表去查詢元素,效率太低了。可以根據目錄的原理,將所有正常的記錄(包括最大和最小記錄,不包括標記為已刪除的記錄)劃分為幾個組。每個組的最後一條記錄(也就是組內最大的那條記錄)的頭資訊中的n_owned屬性表示該記錄擁有多少條記錄,也就是該組內共有幾條記錄。
將每個組的最後一條記錄的位址偏移量單獨提取出來按順序儲存到靠近頁的尾部的地方,這個地方就是所謂的page directory,也就是頁目錄。頁面目錄中的這些位址偏移量被稱為槽,所以這個頁面目錄就是由槽組成的。
對於最小記錄所在的分組只能有 1 條記錄,最大記錄所在的分組擁有的記錄條數只能在 1~8 條之間,剩下的分組中記錄的條數範圍只能在是 4~8 條之間初始情況下乙個資料頁裡只有最小記錄和最大記錄兩條記錄,它們分屬於兩個分組。
之後每插入一條記錄,都會從頁目錄中找到主鍵值比本記錄的主鍵值大並且差值最小的槽,然後把該槽對應的記錄的n_owned值加1,表示本組內又新增了一條記錄,直到該組中的記錄數等於8個。
在乙個組中的記錄數等於8個後再插入一條記錄時,會將組中的記錄拆分成兩個組,乙個組中4條記錄,另乙個5條記錄。這個過程會在頁目錄中新增乙個槽來記錄這個新增分組中最大的那條記錄的偏移量。
所以在乙個資料頁中查詢指定主鍵值的記錄的過程分為兩步:
通過二分法確定該記錄所在的槽。頁之間用雙向鍊錶連線通過記錄的next_record屬性遍歷該槽所在的組中的各個記錄。
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
MySQL深入理解
儲存引擎 innodb表引擎 myisam表引擎 其他的表引擎 索引 索引對效能的影響 索引的使用場景 索引的型別 對比說明 mysql索引的建立原則 mysql索引的注意事項 查詢優化 查詢分析sql查詢慢的原因 優化查詢過程中的資料訪問 避免使用如下sql語句 是否在掃瞄額外的記錄?優化長難的查...
mysql深入理解二
過濾資料 本章講授如何使用select語句的where 子句指定的搜尋條件。資料庫表一般包含 大量的資料,很少需要檢索表中所有的行。通常只會根據特定操作或報告的需要 提取資料的子集。只檢索所需資料需要的指定搜尋條件 search criteria 搜尋條 件也稱為過濾條件 filter condit...