Mysql幾種索引型別的區別及適用情況詳細說明

2021-08-21 09:31:32 字數 3713 閱讀 2092

mysql目前主要有以下幾種索引型別:fulltext,hash,btree,rtree。

fulltext

即為全文索引,目前只有

myisam

引擎支援。

其可以在create table ,alter table ,create index 使用,

不過目前只有 char、varchar ,text 列上可以建立全文索引

。值得一提的是,在資料量較大時候,現將資料放入乙個沒有全域性索引的表中,然後再用create index建立fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。

它的出現是為了

解決where name like 「%word

%"這類針對文字的模糊查詢效率較低的問題。

全文索引的使用方法並不複雜:

建立alter table table add index `fullindex` using fulltext(`cname1`[,cname2…]);

使用select * from table where match(cname1[,cname2…]) against ('word' mode );

其中, mode為搜尋方式(in boolean mode ,in natural language mode ,in natural language mode with query expansion / with query expansion)。

關於這三種搜尋方式,簡單地說,布林模式,允許word裡含一些特殊字元用於標記一些具體的要求,如+表示一定要有,-表示一定沒有,*表示通用匹配符,是不是想起了正則,類似吧;自然語言模式,就是簡單的單詞匹配;含表示式的自然語言模式,就是先用自然語言模式處理,對返回的結果,再進行表示式匹配。

分詞這個概念,fulltext索引也是按照分詞原理建立索引的。西文中,大部分為字母文字,分詞可以很方便的按照空格進行分割。

hash

其實,hash就是一種(key=>value

)形式的鍵值對,如數學中的函式對映,

允許多個key對應相同的value,但不允許乙個key對應多個value

。正是由於這個特性,hash很適合做索引,為某一列或幾列建立hash索引,就會利用這一列或幾列的值通過一定的演算法計算出乙個hash值,對應一行或幾行資料(這裡在概念上和函式對映有區別,不要混淆)。hash的生成方法有很多種,足可以保證hash碼的唯一性,例如在mongodb中,每乙個document都有系統為其生成的唯一的objectid(包含時間戳,主機雜湊值,程序pid,和自增id)也是一種hash的表現。

由於hash索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。

mysql的btree索引和hash索引的區別

(1)hash 索引僅僅能滿足"=","in"和"<=>"查詢,

不能使用範圍查詢

。 由於 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 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

愚安我稍作補充,講一下hash索引的過程,順便解釋下上面的第4,5條:

當我們為某一列或某幾列建立hash索引時(目前就只有memory引擎顯式地支援這種索引),會在硬碟上生成類似如下的檔案:

hash值 

儲存位址    

1db54bc745a1

77#45b5 

4bca452157d4

76#4556,77#45cc…

…hash值即為通過特定演算法由指定列資料計算出來,磁碟位址即為所在資料行儲存在硬碟上的位址(也有可能是其他儲存位址,其實memory會將hash表匯入記憶體)。

這樣,當我們進行where age = 18 時,會將18通過相同的演算法計算出乙個hash值==>在hash表中找到對應的儲存位址==>根據儲存位址取得資料。

所以,每次查詢時都要遍歷hash表,直到找到對應的hash值,如(4),資料量大了之後,hash表也會變得龐大起來,效能下降,遍歷耗時增加,如(5)。

btree

btree索引就是一種將索引值按一定的演算法,存入乙個樹形的資料結構中,相信學過資料結構的童鞋都對當初學習二叉樹這種資料結構的經歷記憶猶新,如二叉樹一樣,每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。

btree在myisam裡的形式和innodb稍有不同

在 innodb裡,有兩種形態:一是primary key形態,其leaf node裡存放的是資料,而且不僅存放了索引鍵的資料,還存放了其他欄位的資料。二是secondary index,其leaf node和普通的btree差不多,只是還存放了指向主鍵的資訊.

而在myisam裡,主鍵和其他的並沒有太大區別。不過和innodb不太一樣的地方是在myisam裡,leaf node裡存放的不是主鍵的資訊,而是指向資料檔案裡的對應資料行的資訊.

rtree

rtree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam、bdb、innodb、ndb、archive幾種。

相對於btree,rtree的優勢在於範圍查詢.

各種索引的使用情況

(1)對於btree這種mysql預設的索引型別,具有普遍的適用性

(2)由於fulltext對中文支援不是很好,在沒有外掛程式的情況下,最好不要使用。其實,一些小的部落格應用,只需要在資料採集時,為其建立關鍵字列表,通過關鍵字索引,也是乙個不錯的方法。

(3)對於一些搜尋引擎級別的應用來說,fulltext同樣不是乙個好的處理方法,mysql的全文索引建立的檔案還是比較大的,而且效率不是很高,即便是使用了中文分詞外掛程式,對中文分詞支援也只是一般。真要碰到這種問題,apache的lucene或許是你的選擇。

(4)正是因為hash表在處理較小資料量時具有無可比擬的素的優勢,所以hash索引很適合做快取(記憶體資料庫)。如mysql資料庫的記憶體版本memsql,使用量很廣泛的快取工具mencached,nosql資料庫redis等,都使用了hash索引這種形式。當然,不想學習這些東西的話mysql的memory引擎也是可以滿足這種需求的。

(5)至於rtree,我至今還沒有使用過,它具體怎麼樣,我就不知道了。有rtree使用經歷的同學,到時可以交流下!

mysql幾種索引 mysql的幾種索引

為什麼建立索引後,速度就會變快?答 使用索引後,查詢是按二叉樹演算法來查詢到記錄 索引使用的注意事項 索引的代價 1.占用磁碟空間 2.對dml 新增 修改 刪除 操作有影響,變慢 在哪些列上適合新增索引 1.較頻繁的作為查詢條件字段應該建立索引 select from emp where empn...

mysql 索引及區別

聚集索引和非聚集索引的區別 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。聚集索引 聚集索引表記錄的排列順序和索引的排列順序一致,所以查詢效率快,只要找到第乙個索引值記錄,其餘就連續性的記錄在物理也一樣連續存放。聚集索引對應的缺點就是修改慢,因為為了保證表中記錄的物理和...

Mysql索引介紹及常見索引的區別

mysql索引概念 說說mysql索引,看到乙個很少比如 索引就好比一本書的目錄,它會讓你更快的找到內容,顯然目錄 索引 並不是越多越好,假如這本書1000頁,有500也是目錄,它當然效率低,目錄是要佔紙張的,而索引是要佔磁碟空間的。mysql索引主要有兩種結構 b tree索引和hash索引.ha...