MySQL索引結構類型

索引的類別包括-

主鍵索引( PRIMARY ):數據列不允許重復,不允許為NULL.一個表只能有一個主鍵。

唯一索引( UNIQUE ):數據列不允許重復,允許為NULL值,一個表允許多個列創(chuàng)建唯一索引。

普通索引( INDEX ):基本的索引類型,沒有唯一性的限制,允許為NULL值。

全文索引(FULLTEXT 索引在 MySQL 5.6 版本之后支持 InnoDB,而之前的版本只支持 MyISAM 表。)

索引的數據結構包括-

B-Tree索引

MyISAM和InnoDB都支持這種索引,因此說它是應用最廣泛,最常用的一種索引方式,但是不同的存儲引擎在具體實現時會稍有不同,比如MyISAM會使用前綴壓縮的方式對索引進行壓縮,InnoDB則不會。

B-Tree只是底層的算法實現,唯一索引,主鍵索引,普通索引都是基于B-Tree索引算法的,只不過又有各自的特點。

這篇文章對于B-Tree有著比較好視圖理解-https://segmentfault.com/a/1190000010264071

B-Tree的缺點

即索引失效的原因-http://www.itdecent.cn/p/d5b2f645d657

InnoDB索引MyISAM索引的區(qū)別:

一是主索引的區(qū)別,InnoDB的數據文件本身就是索引文件。而MyISAM的索引和數據是分開的。

InnoDB的索引實現后,就很容易明白為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。

二是輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區(qū)別。

這篇文章詳細講授了B-Tree的實現原理和在各個引擎的工作情況-http://blog.csdn.net/bigtree_3721/article/details/73650601

這篇文章很好的對B-Tree和B+Tree做了分布的解釋說明-https://mp.weixin.qq.com/s/U_GcVrvZQWPlK4X6Afy4-Q

在和我朋友打電話過程中有不少朋友認為所謂B-Tree就是二叉樹或者紅黑樹

二分查找要求被檢索數據有序,而二叉樹查找只能應用于二叉查找樹上,但是數據本身的組織結構不可能完全滿足各種數據結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在數據之外,數據庫系統(tǒng)還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。

哈希索引

哈希索引的實現就比較簡單了,它是基于哈希表來實現的,對于要索引的列,存儲引擎會計算出一一對應的哈希碼,然后把哈希碼存放在哈希表中作為key,value值是指向該行數據的指針。

優(yōu)勢:

只需比對哈希值,因此速度非常快,性能優(yōu)勢明顯;

限制:

不支持任何范圍查詢,比如where price > 150,因為是基于哈希計算,支持等值比較。

哈希表是無序存儲的,因此索引數據無法用于排序。

主流存儲引擎不支持該類型,比如MyISAM和InnoDB。哈希索引只有Memory, NDB兩種引擎支持。值得一提的是,memory引擎是支持非唯一哈希索引的。在數據庫世界里是比較與眾不同,如果多個列的哈希值相同,索引會以鏈表的方式存放多個記錄指針到同一個哈希條目中。

如果哈希沖突很多的話,一些索引維護操作的代價也很高,如:如果在某個選擇性很低的列上建立哈希索引(即很多重復值的列),那么當從表中刪除一行時,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到并刪除對應的引用,沖突越多,代價越大。

哈希索引是一種非常快的等值查找方法(注意:必須是等值,哈希索引對非等值查找方法無能為力),它查找的時間復雜度為常量,InnoDB采用自適用哈希索引技術,它會實時監(jiān)控表上索引的使用情況,如果認為建立哈希索引可以提高查詢效率,則自動在內存中的“自適應哈希索引緩沖區(qū)”(詳見《MySQL - 淺談InnoDB體系架構》中內存構造)建立哈希索引。

innodb引擎有一個特殊的功能叫做自適應哈希索引,當innodb注意到某些索引值被使用的非常頻繁時,它會在內存中基于btree索引之上再創(chuàng)建一個哈希索引,這樣就讓btree索引也具有哈希索引的一些優(yōu)點,比如:快速的哈希查找,這是一個全自動的,內部的行為,用戶無法控制或者配置,不過如果有必要,可以選擇關閉這個功能(innodb_adaptive_hash_index=OFF,默認為ON)。

空間數據索引(R-Tree)

空間索引可用于地理數據存儲,它需要GIS相關函數的支持,由于MySQL的GIS支持并不完善,所以該索引方式在MySQL中很少有人使用。

全文索引

類似lucene分詞的分詞實現方式,如果使用中文的話有一個Mysql的中文分詞插件Mysqlcft.

順便記錄一下幾個引擎

InnoDB 支持事務,支持行級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

MyISAM 不支持事務,支持表級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

Memory 不支持事務,支持表級別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;

NDB 支持事務,支持行級別鎖定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;

Archive 不支持事務,支持表級別鎖定,不支持 B-tree、Hash、Full-text 等索引;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容