目录
提前声明,本帖内容主要是用来背诵记忆的,没有深入底层讲解索引的原理,是为面试而总结的一些知识点,如果各位想深入了解索引的底层原理B+树,可以看我的另一篇文章,里面说的非常详细。
1. 什么是索引?
MySQL 官方对索引的定义是:索引(index)是帮助 MySQL 高效获取数据的数据结构。
由此不难看出,索引的本质是数据结构。可以简单理解为“排好序的快速查找数据结构”,满足特定的查找算法,这些索引结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。另外,索引是在存贮引擎中实现的,因此不同存储引擎中索引的实现原理不一定完全相同。
2. 索引的优点?
(1)提高数据的检索效率,降低数据库的IO成本,这也是创建索引最主要的原因。
(2)通过创建唯一索引,可以保证表中每一行数据的唯一性。
(3)在实现数据的参考完整性方面,可以加速表与表之间的连接。换句话说就是,对于有依赖关系的子表和父表联合查询时,可以提高查询速度。
(4)在使用分组和排序进行查询时,可以显著减少查询中分组和排序的时间,降低CPU的消耗。
3. 索引的缺点?
(1)创建索引和维护索引需要耗费时间,并且随着数据量的增加,耗费时间也会增加。
(2)索引需要占用磁盘空间,除了数据库中表占用的磁盘空间之外,每一个索引也会占用一定的物理空间,存贮在磁盘上,如果有大量的索引,可能索引文件比数据库文件更快达到最大文件尺寸。
(3)虽然索引大大提高了表的查询效率,但同时也降低了更新表的速度。当对表中的数据进行增删改时,索引也需要动态地维护,这样就降低了数据的维护速度。
4. 索引的分类?
MySql索引包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引。
(1)从功能逻辑上分:主要分为四种,普通索引,唯一索引,主键索引,全文索引。
(2)从物理实现上分:分为聚簇索引和非聚簇索引。
(3)从作用字段划分:分为单列索引和联合索引。
5. 表中添加索引的三种方式?
(1)创建表的时候就创建索引。
(2)使用 ALTER TABLE ‘表名’ ADD (索引修饰符) INDEX ‘索引名’ (‘表字段’ ) 创建索引。
(3)使用 CREATE (索引修饰符) INDEX '索引名' ON 表名 (表字段) 创建索引。
6. 表中如何删除索引?
(1)使用 ALTER TABLE ‘表名’ DROP INDEX ‘索引名’ 删除索引。
(2)使用 DROP INDEX ‘索引名’ ON 表名 删除索引。
关于数据库的索引,下面从什么情况下适合建立索引,什么情况下不适合建立索引以及索引失效的几种情况来进行说明。
7. 什么情况下适合建立索引?
(1)字段的数值有唯一性限制;
(2)频繁作为 where 查询条件的字段;
(3)经常 GROUP BY 和 ORDER BY的列;
(4)UPDATE ,DELETE,WHERE的条件列;
(5)DISTINCT 字段需要添加索引;
(6)多表join..on..连接操作时;首先要注意,表的链接最好不要超过三张,因为每增加一张表相当于增加了一次嵌套循环,表数据之间的笛卡尔积数量会迅速增长,严重影响查询效率;
其次要注意,对WHERE条件创建索引,WHERE是条件过滤。
最后要注意,对用于连接的字段创建索引,并且该字段在多张表的类型必须一致。
(7)使用列的类型小的创建索引。这里说的类型小指的是该类型表示的数据范围的大小。
(8)使用字符串前缀创建索引。
(9)区分度高(散列度高)的列适合创建索引。
(10)使用最频繁的列放到联合索引的左侧。
(11)在多个字段都要创建索引时,联合索引优于单值索引。
8. 什么情况下不适合建立索引?
(1)在WHERE 中使用不到的字段,不添加索引。
(2)数据量小的表最好不要添加索引。
(3)有大量重复数据的列不要创建索引。
(4)经常更新的表不创建过多索引。
(5)不建议用无序的值创建索引。
(6)删除不再使用或者很少使用的索引。
(7)不要定义冗余或者重复的索引。