索引的類別包括-
主鍵索引( 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 等索引;