索引概述
索引(index) 是帮助 MySQL 高效获取数据的数据结构(有序)。
在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的优缺点
优势: 提高数据检索的效率,降低数据库的IO成本。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU 的消耗;
劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍
虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE 。 因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引的字段,都会调整因为更新所带来的键值变化后的索引信息;
mysql中InnoDB默认支持的B+Tree结构
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构
- B+节点关键字搜索采用闭合区间
- B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用
- B+关键字对应的数据保存在叶子节点中
- B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
索引分类
1 ) 单值索引 :即一个索引只包含单个列,一个表可以有多个单列索引
2 ) 唯一索引 :索引列的值必须唯一,但允许有空值
3 ) 复合索引 :即一个索引包含多个列
索引语法
1.创建索引
CREATE [索引的种类] INDEX 索引的名字 [索引的类型] ON 表名 (字段名)
2.查看索引
show index from 表名;
3.删除索引
DROP INDEX 索引名 ON 表名;
4.ALTER命令
1). alter table tb_name add primary key(column_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
2). alter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
3). alter table tb_name add index index_name(column_list);
添加普通索引, 索引值可以出现多次。
4). alter table tb_name add fulltext index_name(column_list);
该语句指定了索引为FULLTEXT, 用于全文索引
索引设计原则
(什么样的表适合创建索引)
对查询频次较高,且数据量比较大的表建立索引。
(什么样的字段适合创建索引)
2. 对经常在where子句中出现的字段建立索引
使用唯一索引,区分度越高,使用索引的效率越高。
对于插入、更新、删除等 DML 操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低 DML 操作的效率,增加相应操作的时间消耗。
5. 尽量使用短字段索引
6. 针对于复合索引,使用最左索引