1.什么是索引
索引是⼀种特殊的⽂件,包含着对数据表⾥所有记录的引⽤指针。可以对表中的⼀列或多列创建
索引,并指定索引的类型,各类索引有各⾃的数据结构实现。
2.为什么需要索引
数据库中数据存储在磁盘,磁盘的顺序查询速度是很慢的,所以的顺序查找指的是读取磁盘中的数
据⼀条⼀条的进⾏查找。索引可以提⾼查询效率,所以每个表中都会有索引。
3.索引的作⽤
●
数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍⽬录的关系。
●
索引所起的作⽤类似书籍⽬录,可⽤于快速定位、检索数据。
●
索引对于提⾼数据库的性能有很⼤的帮助。
4.索引优缺点和使⽤场景
4.1 索引优点
●
提⾼数据库查询效率。
●
减少主从复制从库的延迟时间。
4.2 索引缺点
●索引维护成本很⾼,因为它使⽤的 B+ 树,每次新增、删除数据都需要整理树结构。
●占⽤更多的存储空间(磁盘和内存):每个索引都对应⼀个 B+ 树。
●索引过多会对 MySQL 的优化器造成⼀定的负担。
4.3 使⽤场景
要考虑对数据库表的某列或某⼏列创建索引,需要考虑以下⼏点:
●数据量较⼤。
●且经常查询的列。
满⾜以上条件时,考虑对表中的这些字段创建索引,以提⾼查询效率。
4.4 注意事项
●如果是不常使⽤的列,或经常做插⼊、修改操作的列,不适合加索引,因为添加、删除需要
重新整理索引,速度很慢。
●索引会占⽤额外的磁盘空间,或磁盘空间不⾜时,不考虑创建索引。
●不要在线上环境随意创建索引,创建索引会锁表,线上数量⼤,会导致其他所有接⼝不可
⽤,从⽽造成重⼤事故。
5.索引使⽤
5.1 索引分类
索引的分类有以下⼏种:
●
主键索引(聚簇索引):⼀种特殊的唯⼀索引,不允许有空值,⼀般是在建表的时候同时创建主
键索引(通过 primary key)。
●
⾮主键索引(⼆级索引):除主键索引之外的其他索引。
●
唯⼀索引:不能重复的索引。
●
普通索引:可以重复也可以为 NULL 的索引。
●
联合索引:使⽤多个字段联合组成的索引。
注意:创建主键约束(PRIMARY KEY)、唯⼀约束(UNIQUE)、外键约束(FOREIGN KEY)
时,会⾃动创建对应列的索引。
5.2 查看索引
show index from 表名;
5.3 创建索引
5.3.1 创建普通索引
create index 索引名 on 表名(字段名[,字段名2...]);
5.3.2 创建唯⼀索引
create unique index 索引名 on 表名(字段名);
5.3.3 添加主键索引
alter table table_name add primary key (column);
5.3删除索引
drop index 索引名 on 表名;
6.索引实现原理
索引的实现经历了
3
个阶段的升级:
●
⼆叉树
缺点:数据⼤之后树很⾼,维护和查询的性能不好。
●
B 树
缺点:所有节点都保存了数据,加载需要很⻓的时间。
●
B+ 树
只有叶⼦节点才存储数据,且数据和索引是分离的,所谓的存储的数据,其实是指向数据的地址,
数据量变的⾮常⼩。
7.索引和约束的区别
●
定义和作⽤不同:约束是保证数据的可靠性的;索引是加速查询的,不是⼀回事。
●
可以相互创建:当创建了主键、外键、唯⼀约束也就创建了相应的索引;当创建了唯⼀索引,也
就创建了唯⼀约束。
8.聚簇索引和⾮聚簇索引有什么区别
●
执⾏效率:聚簇索引查询速度更快,因为聚簇索引存储的是数据,⽽⾮聚簇索引存储的是主键
ID,需要进⾏回表查询。
●
数量上:聚簇索引⼀个表只能有⼀个,⽽⾮聚簇索引可以有多个。