一、索引
MySQL索引的建立對于MySQL的高效運作是很重要的,索引可以大大提高MySQL的檢索速度
二、索引類型
Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
1. FULLTEXT
即為全文索引,目前隻有MyISAM引擎支援。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前隻有 CHAR、VARCHAR ,TEXT 列上可以建立全文索引。全文索引并不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文本的模糊查詢效率較低的問題。
2. HASH
由于HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很适合作為索引。HASH索引可以一次定位,不需要像樹形索引那樣逐層查找,是以具有極高的效率。但是,這種高效是有條件的,即隻在“=”和“in”條件下高效,對于範圍查詢、排序及組合索引仍然效率不高。
3. BTREE
BTREE索引就是一種将索引值按一定的算法,存入一個樹形的資料結構中(二叉樹),每次查詢都是從樹的入口root開始,依次周遊node,擷取leaf。這是MySQL裡預設和最常用的索引類型。
4. RTREE
RTREE在MySQL很少使用,僅支援geometry資料類型,支援該類型的存儲引擎隻有MyISAM、BDb、InnoDb、NDb、Archive幾種。相對于BTREE,RTREE的優勢在于範圍查找
三、索引種類
普通索引:僅加速查詢
唯一索引:加速查詢 + 列值唯一(可以有null)
主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中隻有一個
組合索引:多列值組成一個索引,專門用于組合搜尋,其效率大于索引合并
全文索引:對文本的内容進行分詞,進行搜尋
四、索引操作
1.建立索引
--建立普通索引
CREATE INDEX index_name ON table_name(col_name);--建立唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);--建立普通組合索引
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);--建立唯一組合索引
CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
ALTER TABLE table_name ADD INDEX index_name(col_name);
2.刪除索引
-- 直接删除索引
DROP INDEX index_name ON table_name;
-- 修改表結構删除索引
ALTER TABLE table_name DROP INDEX index_name;
3.檢視索引
#檢視:
show index from `表名`;
#或
show keys from `表名`;
4.其他指令
--檢視表結構
desc table_name;--檢視生成表的SQL
show create table table_name;
五、索引機制
1.為什麼我們添加完索引後查詢速度為變快?
傳統的查詢方法,是按照表的順序周遊的,不論查詢幾條資料,mysql需要将表的資料從頭到尾周遊一遍
在我們添加完索引之後,mysql一般通過BTREE算法生成一個索引檔案,在查詢資料庫時,找到索引檔案進行周遊(折半查找大幅查詢效率),找到相應的鍵進而擷取資料
2.索引的代價
2.1建立索引是為産生索引檔案的,占用磁盤空間
2.2索引檔案是一個二叉樹類型的檔案,可想而知我們的dml操作同樣也會對索引檔案進行修改,是以性能會下降
3.在哪些column上使用索引?
3.1較頻繁的作為查詢條件字段應該建立索引
3.2唯一性太差的字段不适合建立索引,盡管頻繁作為查詢條件,例如gender性别字段
3.3更新非常頻繁的字段不适合作為索引
3.4不會出現在where子句中的字段不該建立索引
六、總結
滿足以下條件的字段,才應該建立索引
肯定在where條經常使用
該字段的内容不是唯一的幾個值
字段内容不是頻繁變化。