索引的類別包括-
主鍵索引( PRIMARY ):數(shù)據(jù)列不允許重復氓鄙,不允許為NULL.一個表只能有一個主鍵。
唯一索引( UNIQUE ):數(shù)據(jù)列不允許重復,允許為NULL值邀跃,一個表允許多個列創(chuàng)建唯一索引坛猪。
普通索引( INDEX ):基本的索引類型,沒有唯一性的限制污秆,允許為NULL值劈猪。
全文索引(FULLTEXT 索引在 MySQL 5.6 版本之后支持 InnoDB,而之前的版本只支持 MyISAM 表良拼。)
等
索引的數(shù)據(jù)結構包括-
B-Tree索引
MyISAM和InnoDB都支持這種索引战得,因此說它是應用最廣泛,最常用的一種索引方式庸推,但是不同的存儲引擎在具體實現(xiàn)時會稍有不同常侦,比如MyISAM會使用前綴壓縮的方式對索引進行壓縮,InnoDB則不會贬媒。
B-Tree只是底層的算法實現(xiàn)聋亡,唯一索引,主鍵索引际乘,普通索引都是基于B-Tree索引算法的坡倔,只不過又有各自的特點。
這篇文章對于B-Tree有著比較好視圖理解-https://segmentfault.com/a/1190000010264071
B-Tree的缺點
即索引失效的原因-http://www.reibang.com/p/d5b2f645d657
InnoDB索引和MyISAM索引的區(qū)別:
一是主索引的區(qū)別脖含,InnoDB的數(shù)據(jù)文件本身就是索引文件罪塔。而MyISAM的索引和數(shù)據(jù)是分開的。
InnoDB的索引實現(xiàn)后养葵,就很容易明白為什么不建議使用過長的字段作為主鍵征堪,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大关拒。再例如佃蚜,用非單調的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree夏醉,非單調的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調整爽锥,十分低效,而使用自增字段作為主鍵則是一個很好的選擇畔柔。
二是輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址氯夷。而MyISAM的輔助索引和主索引沒有多大區(qū)別。
這篇文章詳細講授了B-Tree的實現(xiàn)原理和在各個引擎的工作情況-http://blog.csdn.net/bigtree_3721/article/details/73650601
這篇文章很好的對B-Tree和B+Tree做了分布的解釋說明-https://mp.weixin.qq.com/s/U_GcVrvZQWPlK4X6Afy4-Q
在和我朋友打電話過程中有不少朋友認為所謂B-Tree就是二叉樹或者紅黑樹
二分查找要求被檢索數(shù)據(jù)有序,而二叉樹查找只能應用于二叉查找樹上框沟,但是數(shù)據(jù)本身的組織結構不可能完全滿足各種數(shù)據(jù)結構(例如,理論上不可能同時將兩列都按順序進行組織)喂柒,所以踩蔚,在數(shù)據(jù)之外棚放,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結構,這些數(shù)據(jù)結構以某種方式引用(指向)數(shù)據(jù)馅闽,這樣就可以在這些數(shù)據(jù)結構上實現(xiàn)高級查找算法飘蚯。這種數(shù)據(jù)結構,就是索引福也。
哈希索引
哈希索引的實現(xiàn)就比較簡單了局骤,它是基于哈希表來實現(xiàn)的,對于要索引的列暴凑,存儲引擎會計算出一一對應的哈希碼峦甩,然后把哈希碼存放在哈希表中作為key,value值是指向該行數(shù)據(jù)的指針现喳。
優(yōu)勢:
只需比對哈希值凯傲,因此速度非常快嗦篱,性能優(yōu)勢明顯冰单;
限制:
不支持任何范圍查詢,比如where price > 150默色,因為是基于哈希計算球凰,支持等值比較。
哈希表是無序存儲的腿宰,因此索引數(shù)據(jù)無法用于排序呕诉。
主流存儲引擎不支持該類型,比如MyISAM和InnoDB吃度。哈希索引只有Memory, NDB兩種引擎支持甩挫。值得一提的是,memory引擎是支持非唯一哈希索引的椿每。在數(shù)據(jù)庫世界里是比較與眾不同伊者,如果多個列的哈希值相同,索引會以鏈表的方式存放多個記錄指針到同一個哈希條目中间护。
如果哈希沖突很多的話亦渗,一些索引維護操作的代價也很高,如:如果在某個選擇性很低的列上建立哈希索引(即很多重復值的列)汁尺,那么當從表中刪除一行時法精,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到并刪除對應的引用,沖突越多搂蜓,代價越大狼荞。
哈希索引是一種非常快的等值查找方法(注意:必須是等值帮碰,哈希索引對非等值查找方法無能為力)相味,它查找的時間復雜度為常量,InnoDB采用自適用哈希索引技術殉挽,它會實時監(jiān)控表上索引的使用情況丰涉,如果認為建立哈希索引可以提高查詢效率,則自動在內存中的“自適應哈希索引緩沖區(qū)”(詳見《MySQL - 淺談InnoDB體系架構》中內存構造)建立哈希索引此再。
innodb引擎有一個特殊的功能叫做自適應哈希索引昔搂,當innodb注意到某些索引值被使用的非常頻繁時,它會在內存中基于btree索引之上再創(chuàng)建一個哈希索引输拇,這樣就讓btree索引也具有哈希索引的一些優(yōu)點,比如:快速的哈希查找贤斜,這是一個全自動的策吠,內部的行為,用戶無法控制或者配置瘩绒,不過如果有必要猴抹,可以選擇關閉這個功能(innodb_adaptive_hash_index=OFF,默認為ON)锁荔。
空間數(shù)據(jù)索引(R-Tree)
空間索引可用于地理數(shù)據(jù)存儲蟀给,它需要GIS相關函數(shù)的支持,由于MySQL的GIS支持并不完善阳堕,所以該索引方式在MySQL中很少有人使用跋理。
全文索引
類似lucene分詞的分詞實現(xiàn)方式,如果使用中文的話有一個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 等索引姑宽;