4.1 自適應哈希索引概念
MySQL 中的自適應哈希索引 (Adaptive Hash Index, AHI) 是 InnoDB 存儲引擎的一項性能優化功能。它旨在通過動態創建和維護哈希索引來加速某些類型的查詢操作,特別是那些涉及高頻率讀取訪問的查詢。
自適應哈希索引的工作原理
-
動態創建:當 InnoDB 發現某些頁在緩沖池中頻繁被訪問時,它會動態地創建一個哈希索引。這個哈希索引可以加速對這些頁的查找。
-
頁面級別:AHI 在頁面級別工作,而不是在表級別工作。這意味著它為緩沖池中的某些頁面創建哈希索引,而不是為整個表創建。
-
內存駐留:哈希索引駐留在內存中,利用緩沖池加速查詢。因此,創建和維護哈希索引會消耗一些內存資源。
-
自動管理:InnoDB 自動管理自適應哈希索引的創建和刪除,不需要手動干預。它會根據訪問模式和緩沖池的使用情況動態調整。
對用戶透明的,MySQL內部自動維護和管理。(LRU,最近最少使用)
配置和監控自適應哈希索引
-
啟用或禁用:默認情況下,自適應哈希索引是啟用的。可以通過配置參數
innodb_adaptive_hash_index來啟用或禁用它。 -
監控使用情況:可以通過查看 InnoDB 的狀態變量來監控自適應哈希索引的使用情況。例如:
4.2 頁面 (Page) 和 AHI 條目
-
頁面:
-
InnoDB 將數據存儲在稱為頁面的基本單元中。每個頁面通常是 16KB 的大小,包含表中的多行數據。
-
頁面在緩沖池中被管理和緩存,以減少磁盤 I/O 操作。
-
-
AHI 條目:
-
AHI 條目是指在自適應哈希索引中為某個頁面建立的哈希索引條目。
-
這些條目可以加速對頻繁訪問的頁面的查找操作,從而提升查詢性能。(哈希值-頁面偏移,O(1) 而不是O (n))
-
AHI 條目的工作原理
-
動態創建:當 InnoDB 發現某個頁面在緩沖池中被頻繁訪問時,它會動態地為該頁面創建一個 AHI 條目。
-
哈希表:這些 AHI 條目存儲在內存中的哈希表中,通過哈希函數可以快速定位頁面。
-
提高性能:通過將頻繁訪問的頁面映射到哈希表,InnoDB 可以大幅減少查找時間,從而加快查詢響應速度。(LRU)
管理和監控 AHI
配置 AHI
可以通過設置 innodb_adaptive_hash_index 變量來啟用或禁用 AHI:
查看 AHI 狀態
InnoDB 的自適應哈希索引通過為頻繁訪問的頁面創建哈希索引條目,顯著提升了查詢性能。理解頁面和 AHI 條目如何協同工作,可以幫助優化數據庫的性能和響應時間。通過適當的配置和監控,可以確保自適應哈希索引在系統中發揮最佳作用。
這些條件和閾值通常對用戶是透明的,因為自適應哈希索引的構建和維護是由 InnoDB 自動完成的。用戶可以通過 SHOW ENGINE INNODB STATUS 命令來查看自適應哈希索引的使用情況,但通常不需要直接干預其構建和維護過程。
4.3 AHI 插槽
在 InnoDB 自適應哈希索引 (Adaptive Hash Index, AHI) 的上下文中,"AHI 槽" 是指用于存儲哈希條目的特定哈希表插槽。自適應哈希索引通過哈希函數將表或索引頁映射到哈希表中的一個特定插槽(或桶),每個插槽可以包含一個或多個哈希條目。
AHI 槽的作用
-
哈希函數:當訪問某個表或索引頁時,InnoDB 會使用哈希函數計算出該頁在哈希表中的插槽位置。
-
插槽 (Slot):哈希表由多個插槽組成,每個插槽可以存儲一個或多個哈希條目。一個插槽可以視為一個桶,存儲多個鍵值對。
-
鎖定機制:為了保證并發訪問的安全性,InnoDB 使用鎖定機制來保護這些插槽。在進行插入、刪除或查找操作時,需要對插槽進行相應的鎖定。
排他閂鎖 (X Latch)
排他閂鎖 (X Latch) 是一種鎖定機制,確保在一個線程修改插槽中的內容時,其他線程不能同時讀取或修改該插槽(注意不是所有的哈希條目)。排他閂鎖的特性包括:
-
獨占訪問:持有排他閂鎖的線程可以獨占訪問該槽,防止其他線程進行并發訪問。
-
保護數據一致性:通過排他閂鎖,可以確保在槽中的數據修改操作是原子的,不會出現競態條件。
保護機制
在 InnoDB 中,當需要修改 AHI 中的條目(例如刪除或禁用 AHI)時,會使用排他閂鎖 (X Latch) 保護插槽,以確保沒有其他線程可以同時訪問或修改該插槽中的數據。這種機制有助于維護數據的一致性和完整性。
代碼實現中的 AHI 槽
假設我們有一個哈希表 btr_search_latches,每個插槽在 btr_ahi_parts 范圍內:
btr_search_latches 是一個數組,每個元素代表一個插槽。當以共享模式鎖定所有搜索閂鎖時,多個線程可以同時讀取這些插槽。
當需要修改 AHI 條目時,例如刪除某個條目,可以使用排他閂鎖來保護插槽:
在刪除 AHI 條目時,先鎖定插槽,再進行刪除操作:
總結
-
AHI 槽:是自適應哈希索引中用于存儲哈希條目的特定插槽。
-
排他閂鎖 (X Latch):用于保護插槽,確保在一個線程修改插槽內容時,其他線程不能同時訪問或修改該插槽。
-
保護機制:通過排他閂鎖,InnoDB 確保在刪除或禁用 AHI 時的操作是安全的,不會出現并發問題。
通過這種方式,InnoDB 可以在保證數據一致性和完整性的同時,提升查詢性能。