一、索引
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條
經常使用
- 該字段的內容
不是唯一的幾個值
- 字段內容
不是頻繁變化
。