爲什麼使用Hash?
如果某個數據經常被訪問,當滿足一定條件的時候,就會將這個數據頁的地址存放到 Hash 表中。這樣下次查詢的時候,就可以直接找到這 個頁面的所在位置。
需要說明的是自適應 Hash 索引只保存熱數據(經常被使用到的數據),並非全表數據。因 此數據量並不會很大,因此自適應 Hash 也是存放到緩衝池中,這樣也進一步提升了查找效 率。
Hash衝突
Hash 表是數組 + 鏈表的形式。通過 Hash 函數可以計算索引鍵值所對應的 bucket(桶) 的位置,如果產生 Hash 衝突,就需要遍歷鏈表來解決。
Hash索引缺陷和優點
缺點
Hash 索引僅能滿足(=)(<>)和 IN 查詢,不能使用範圍查詢。此外,數據的存儲是沒有順序的,在 ORDER BY 的情況下,使用 Hash 索引還需要對數據重新排序。而對於聯合索引的情況,Hash 值是將聯合索引鍵合併後一起來計算的,無法對單獨的一個鍵或者幾個索引鍵進行查詢。
優點
因爲 Hash 索引在進行數據檢索的時候效率非常高,通常只 需要 O(1) 的複雜度,也就是一次就可以完成數據的檢索。
什麼是聯合索引的最左原則?
假設我們有 x、y、z 三個字段,創建聯合索引(x, y, z)之後,我們可以把 x、y、z 分別類 比成“百分位”、“十分位”和“個位”。
1.查詢“y=8 AND z=7”,就用不上索引了,因爲可能存在 187、287、387、487………這 樣就必須掃描所有數值。
2.當我們查詢“x=9 AND y>8 AND z=7”的時候,如果建立了 (x,y,z) 順序的索引,這時候 z 是用不上索引的。這是因爲 MySQL 在匹配聯合索引最左前綴的時候,如果遇到了範圍查 詢,比如(<)(>)和 between 等,就會停止匹配。索引列最多作用於一個範圍列,對於後面的 Z 來說,就沒法使用到索引了。
最後你需要記住,如果我們遇到了範圍條件查詢,比如(<)(<=)(>)(>=)和 between 等,那麼範圍列後的列就無法使用到索引了
使用緩衝池技術的原因
InnoDB 存儲引擎基於磁盤文件存儲,訪問物理硬盤和在內存中進行訪問,速度相差很大,爲了儘可能彌補這兩者之間 I/O 效率的差值,我們就需要把經常使用的數據加載到緩衝池中,避免每次訪問都進行磁盤 I/O
“頻次 * 位置”原則
位置決定效率,提供緩衝池就是爲了在內存中可以直接訪問數據。
頻次決定優先級順序。因爲緩衝池的大小是有限的,比如磁盤有 200G,但是內存只 有 16G,緩衝池大小隻有 1G,就無法將所有數據都加載到緩衝池裏,這時就涉及到優先級 順序,會優先對使用頻次高的熱數據進行加載。
預讀
緩衝池的作用就是提升 I/O 效率,而我們進行讀取數據的時候存在一個“局部性原理”, 也就是說我們使用了一些數據,大概率還會使用它周圍的一些數據,因此採用“預讀”的機 制提前加載,可以減少未來可能的磁盤 I/O 操作。