為什么加索引--- 提升查詢的速度
傳統(tǒng)的查詢方法须尚,是按照表的順序遍歷的动分,不論查詢幾條數(shù)據(jù)振愿,mysql需要將表的數(shù)據(jù)從頭到尾遍歷一遍捷犹。
在我們添加完索引之后,mysql一般通過BTREE算法生成一個索引文件冕末,在查詢數(shù)據(jù)庫時萍歉,找到索引文件進行遍歷(折半查找大幅查詢效率),找到相應(yīng)的鍵從而獲取數(shù)據(jù)档桃。
MySQL目前主要有以下幾種索引類型:?
普通索引枪孩、唯一索引 、主鍵索引 藻肄、組合索引 蔑舞、全文索引
普通索引
是最基本的索引,它沒有任何限制嘹屯。
唯一索引
與前面的普通索引類似攻询,不同的就是:索引列的值必須唯一,但允許有空值州弟。如果是組合索引钧栖,則列值的組合必須唯一低零。
主鍵索引
是一種特殊的唯一索引,一個表只能有一個主鍵拯杠,不允許有空值毁兆。
組合索引
指多個字段上創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時的第一個字段阴挣,索引才會被使用气堕。使用組合索引時遵循最左前綴集合。
全文索引
主要用來查找文本中的關(guān)鍵字畔咧,而不是直接與索引中的值相比較茎芭。fulltext索引跟其它索引大不相同,它更像是一個搜索引擎誓沸,而不是簡單的where語句的參數(shù)匹配梅桩。fulltext索引配合match against操作使用,而不是一般的where語句加like拜隧。它可以在create table宿百,alter table ,create index使用洪添,不過目前只有char垦页、varchar,text 列上可以創(chuàng)建全文索引干奢。值得一提的是痊焊,在數(shù)據(jù)量較大時候,現(xiàn)將數(shù)據(jù)放入一個沒有全局索引的表中忿峻,然后再用CREATE index創(chuàng)建fulltext索引薄啥,要比先為一張表建立fulltext然后再將數(shù)據(jù)寫入的速度快很多。
MySQL索引方法
MySQL目前主要有以下幾種索引方法:B-Tree逛尚,Hash垄惧,R-Tree。
B-Tree
B-Tree是最常見的索引類型绰寞,所有值(被索引的列)都是排過序的到逊,每個葉節(jié)點到跟節(jié)點距離相等。所以B-Tree適合用來查找某一范圍內(nèi)的數(shù)據(jù)克握,而且可以直接支持?jǐn)?shù)據(jù)排序(ORDER BY)
B-Tree在MyISAM里的形式和Innodb稍有不同:
MyISAM表數(shù)據(jù)文件和索引文件是分離的蕾管,索引文件僅保存數(shù)據(jù)記錄的磁盤地址
InnoDB表數(shù)據(jù)文件本身就是主索引,葉節(jié)點data域保存了完整的數(shù)據(jù)記錄
Hash索引
僅支持"=","IN"和"<=>"精確查詢菩暗,不能使用范圍查詢:由于Hash索引比較的是進行Hash運算之后的Hash值,所以它只能用于等值的過濾旭蠕,不能用于基于范圍的過濾停团,因為經(jīng)過相應(yīng)的Hash算法處理之后的Hash
不支持排序:由于Hash索引中存放的是經(jīng)過Hash計算之后的Hash值旷坦,而且Hash值的大小關(guān)系并不一定和Hash運算前的鍵值完全一樣,所以數(shù)據(jù)庫無法利用索引的數(shù)據(jù)來避免任何排序運算
在任何時候都不能避免表掃描:由于Hash索引比較的是進行Hash運算之后的Hash值佑稠,所以即使取滿足某個Hash鍵值的數(shù)據(jù)的記錄條數(shù)秒梅,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際數(shù)據(jù)進行相應(yīng)的比較舌胶,并得到相應(yīng)的結(jié)果
檢索效率高捆蜀,索引的檢索可以一次定位,不像B-Tree索引需要從根節(jié)點到枝節(jié)點幔嫂,最后才能訪問到頁節(jié)點這樣多次的IO訪問辆它,所以Hash索引的查詢效率要遠高于B-Tree索引
只有Memory引擎支持顯式的Hash索引,但是它的Hash是nonunique的履恩,沖突太多時也會影響查找性能锰茉。Memory引擎默認(rèn)的索引類型即是Hash索引,雖然它也支持B-Tree索引
R-Tree索引
R-Tree在MySQL很少使用切心,僅支持geometry數(shù)據(jù)類型飒筑,支持該類型的存儲引擎只有MyISAM、BDb绽昏、InnoDb协屡、NDb、Archive幾種全谤。