mysql載入索引檔案格式 Mysql索引型別

2021-10-17 21:54:07 字數 3571 閱讀 8747

圖示中左邊為clustered 形式存放的primary key,右側則為普通的b-tree 索引。兩種索引在root node 和branch nodes 方面都還是完全一樣的。而leaf nodes 就出現差異了。在primary key中,leaf nodes 存放的是表的實際資料,不僅僅包括主鍵欄位的資料,還包括其他欄位的資料,整個資料以主鍵值有序的排列。而secondary index 則和其他普通的b-tree 索引沒有太大的差異,只是在leaf nodes 出了存放索引鍵的相關資訊外,還存放了innodb 的主鍵值。

所以,在innodb 中如果通過主鍵來訪問資料效率是非常高的,而如果是通過secondary index 來訪問資料的話,innodb 首先通過secondary index 的相關資訊,通過相應的索引鍵檢索到leaf node之後,需要再通過leaf node 中存放的主鍵值再通過主鍵索引來獲取相應的資料行。

myisam 儲存引擎的主鍵索引和非主鍵索引差別很小,只不過是主鍵索引的索引鍵是乙個唯一且非空的鍵而已。而且myisam 儲存引擎的索引和innodb 的secondary index 的儲存結構也基本相同,主要的區別只是myisam 儲存引擎在leaf nodes 上面出了存放索引鍵資訊之外,再存放能直接定位到myisam 資料檔案中相應的資料行的資訊(如row number),但並不會存放主鍵的鍵值資訊。

2、hash 索引

hash 索引在mysql 中使用的並不是很多,目前主要是memory 儲存引擎使用,而且在memory 儲存引擎中將hash 索引作為預設的索引型別。所謂hash 索引,實際上就是通過一定的hash 演算法,將需要索引的鍵值進行hash 運算,然後將得到的hash 值存入乙個hash 表中。然後每次需要檢索的時候,都會將檢索條件進行相同演算法的hash 運算,然後再和hash 表中的hash 值進行比較並得出相應的資訊。

在memory 儲存引擎中,mysql 還支援非唯一的hash 索引。可能很多人會比較驚訝,如果是非唯一的hash 索引,那相同的值該如何處理呢?在memory 儲存引擎的hash 索引中,如果遇到非唯一值,儲存引擎會將他們鏈結到同乙個hash 鍵值下以乙個鍊錶的形式存在,然後在取得實際鍵值的時候時候再過濾不符合的鍵。

由於hash 索引結構的特殊性,其檢索效率非常的高,索引的檢索可以一次定位,而不需要像btree索引需要從根節點再到枝節點最後才能訪問到頁節點這樣多次io 訪問,所以hash 索引的效率要遠高於b-tree 索引。

可能很多人又會有疑問了,既然hash 索引的效率要比b-tree 高很多,為什麼大家不都用hash索引而還要使用b-tree 索引呢?任何事物都是有兩面性的,,hash 索引也一樣,雖然hash 索引檢索效率非常之高,但是hash 索引本身由於其實的特殊性也帶來了很多限制和弊端,主要有以下這些:

1). hash 索引僅僅只能滿足「=」,「in」和「<=>」查詢,不能使用範圍查詢;

由於hash 索引所比較的是進行hash 運算之後的hash 值,所以hash 索引只能用於等值的過濾,而不能用於基於範圍的過濾,因為經過相應的hash 演算法處理之後的hash 值的大小關係,並不能保證還和hash 運算之前完全一樣。

2). hash 索引無法被利用來避免資料的排序操作;

由於hash 索引中存放的是經過hash 計算之後的hash 值,而且hash 值的大小關係並不一定和hash 運算前的鍵值的完全一樣,所以資料庫無法利用索引的資料來避免任何和排序運算;

3). hash 索引不能利用部分索引鍵查詢;

對於組合索引,hash 索引在計算hash 值的時候是組合索引鍵合併之後再一起計算hash 值,

而不是單獨計算hash 值,所以當我們通過組合索引的前面乙個或幾個索引鍵進行查詢的時

候,hash 索引也無法被利用到;

4). hash 索引在任何時候都不能避免表掃面;

前面我們已經知道,hash 索引是將索引鍵通過hash 運算之後,將hash 運算結果的hash 值

和所對應的行指標資訊存放於乙個hash 表中,而且由於存在不同索引鍵存在相同hash 值的可能,所以即使我們僅僅取滿足某個hash 鍵值的資料的記錄條數,都無法直接從hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較而得到相應的結果。

5). hash 索引遇到大量hash 值相等的情況後效能並不一定就會比b-tree 索引高;

對於選擇性比較低的索引鍵,如果我們建立hash 索引,那麼我們將會存在大量記錄指標資訊存與同乙個hash 值相關連。這樣要定位某一條記錄的時候就會非常的麻煩,可能會浪費非常多次表資料的訪問,而造成整體效能的地下。

3、full-text 索引

full-text 索引也就是我們常說的全文索引,目前在mysql 中僅有myisam 儲存引擎支援,而且也並不是所有的資料型別都支援全文索引。目前來說,僅有char,varchar 和text 這三種資料型別的列可以建full-text 索引。

一般來說,fulltext 索引主要用來替代效率低下的like '%***%' 操作。實際上,full-text 索引並不只是能簡單的替代傳統的全模糊like 操作,而且能通過多欄位組合的full-text 索引一次全模糊匹配多個字段。

full-text 索引和普通的b-tree 索引的實現區別較大,雖然他同樣是以b-tree 形式來存放索引資料,但是他並不是通過字段內容的完整匹配,而是通過特定的演算法,將字段資料進行分隔後再進行的索引。一般來說mysql 系統會按照四個位元組來分隔。在整個full-text 索引中,儲存內容被分為兩部分,一部分是分隔前的索引字串資料集合,另一部分是分隔後的詞(或者片語)的索引資訊。所以,full-text 索引中,真正在b-tree 索引細細中的並不是我們表中的原始資料,而是分詞之後的索引資料。在b-tree 索引的節點資訊中,存放了各個分隔後的詞資訊,以及指向包含該詞的分隔前字串資訊在索引資料集合中的位置資訊。

full-text 索引不僅僅能實現模糊匹配查詢,在實現了基於自然語言的的匹配度查詢。當然,這個匹配讀到底有多準確就需要讀者朋友去自行驗證了。full-text 通過一些特定的語法資訊,針對自然語言做了各種相應規則的匹配,最後給出非負的匹配值。

此外,有一點是需要大家注意的,mysql 目前的full-text 索引在中文支援方面還不太好,需要借助第三方的補丁或者外掛程式來完成。而且full-text 的建立所消耗的資源也是比較大的,所以在應用於實際生產環境之前還是盡量做好評估。

4、r-tree 索引

r-tree 索引可能是我們在其他資料庫中很少見到的一種索引型別,主要用來解決空間資料檢索的問題。

在mysql 中,支援一種用來存放空間資訊的資料型別geometry,且基於opengis 規範。在mysql5.0.16 之前的版本中,僅僅myisam 儲存引擎支援該資料型別,但是從mysql5.0.16 版本開始,bdb,innodb,ndbcluster 和archive 儲存引擎也開始支援該資料型別。當然,雖然多種儲存引擎都開始支援geometry 資料型別,但是僅僅之後myisam 儲存引擎支援r-tree 索引。

在mysql 中採用了具有二次**特性的r-tree 來索引空間資料資訊,然後通過幾何物件(mrb)資訊來建立索引。

雖然僅僅只有myisam 儲存引擎支援空間索引(r-tree index),但是如果我們是精確的等值匹配,建立在空間資料上面的b-tree 索引同樣可以起到優化檢索的效果,空間索引的主要優勢在於當我們使用範圍查詢的時候,可以利用到r-tree 索引,而這時候,b-tree 索引就無能為力了。

lucene 索引檔案格式

lucene索引檔案格式詳解本文介紹lucene中segment,fnm,fdx,fdt,tii,tis,deletable cfs等格式檔案的用途。1。索引的segment 每個segment代表lucene的乙個完整索引段。通常,在乙個索引中,會包含有多個segment。每個segment都有乙...

lucene 索引檔案格式

下圖是乙個典型的lucene4.x的索引結構圖 lucene4.x之後的所有索引格式如下所示 檔名字尾描述 segments file segments.gen,segments n 儲存段檔案的提交點資訊 lock file write.lock 檔案鎖,保證任何時刻只有乙個執行緒可以寫入索引 s...

lucene索引檔案格式

學習lucene索引檔案格式的目的是通過對lucene資料結構的理解,從而為lucene索引實現打下基礎。索引檔案的整體結構 如下圖,這是整個索引檔案的整體結構,可以看到,實際上lucene索引儲存下了相當多的東西 但是,單從上面的檔案羅列,很難看出來乙個整體的結構,那麼,接下來這張圖就向我們展示這...