一 概述
MySQL官方定义为索引(Index)是帮助MySQL高效获取数据的数据结构,故索引的本质就是一种数据结构。进一步分析,可以理解索引为排好序的快速查找数据的数据结构。
二 索引Index
索引的主要作用是排序和快速定位查找,在我们SQL查找的过程中,Where语句中条件判断是否使用索引会影响到我们的查询效率,此外,根据索引的作用可知,索引还会影响到SQL的排序,即Order by语句。
数据库系统,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据以某种方式引用(如指针指向)数据,这些就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
如图所示,为了加快对col2的查找,可以维护一个右侧所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录的物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。
一般所说的索引在没有特地指明的情况下,一般是指B树(多路搜索树,但并不一定是二叉树)结构的索引,其中聚簇索引,次要索引,复合索引,前缀索引,唯一索引默认都是使用B+树,此外还有Hash索引等。
索引字段不应该频繁删改,索引本身很大,无法全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
三 索引的分类
单值索引:一个索引指包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的指必须是唯一的,当允许有空值。
复合索引:一个索引含有多个列。
一般情况下,一张表的索引个数最好不要超过5个。
创建索引
create [unique] index indexname on table(clumnname(name));
添加索引
alter table [tablename] add [unique] index [indexname] on (clumnname(name)); //该语句创建的索引的值必须是唯一的,除了NULL外,NULL可能会出现多次。
alter table [tablename] add primary key (clumnname(name)) ;//该语句添加一个主键,意味着索引值必须是唯一的,且不能为NULL。
alter table [tablename] add index [indexname] on (clumnname);//添加普通索引,索引值可能出现多次。
alter table [tablename] add FULLTEXT [indexname] on (clumnname);//该语句指定了索引为FULLTEXT,用于全文索引。
删除索引
drop index [indexname] on table;
查看索引
show index from table name\G;
四 索引的结构
B Tree索引
Hash索引
full-text全文索引
R-Tree索引
3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高非常大,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,这样的成本就非常的大
五 索引的使用/不适用条件
应该使用索引的条件
1. 主键自动建立唯一索引
2. 频繁查询的字段应该创建索引
3. 查询中与其它表关联的字段,外键关系建立索引
4. 查询中排序的字段,排序字段若能通过索引去访问将大大提高排序速度
5. 查询中统计或者分组字段
不应该使用索引的条件
1. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
2. Where条件里用不到的字段不创建索引
3. 单键/组合索引,在高并发情况下更加倾向于组合索引
4. 表记录太少
5. 数据重复且分布平均的字段,因该只为进场查询和经常排序的数据列建立索引,当某个数据列中包含许多重复的内容,为它建立索引就没有太大的实际效果。
如果一个表中存在10万条记录,有一个字段A只有True和False两种值,且每个值的分布概率大约为50%,那么对于该表A字段建索引一般不会提高数据库的查询效率。
索引的选择性是指索引列中不同值的数目与表中记录的比,如果一个表中存在2000条记录,表索引列有1980个不同值,那么这个索引的选择性就是1980/2000=0.99,一个索引的选择性越是接近于1,则这个索引的效率就越高。
五 索引的优缺点
实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引列需要占用存储空间。
索引虽然大大提高了查询速度,同时却会减低更新表的速度,如对表进行insert,update和delete操作的时候,因为更新表时,MySQL不仅要保存数据,还要保存索引文件每次更新添加了索引列的字段,都会因为调整更新会带来的键值变化后的索引信息。