關於索引以及緩衝池的一些疑惑

爲什麼使用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 操作。

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