微信公众号:云计算通俗讲义
持续输出技术干货,欢迎关注!
通过本文你将了解:
- 概述
- 分类
- 索引底层实现原理
- 基本操作
- 索引失效
- 索引优化
01 概述
索引是帮助MySQL高效获取数据的排好序的数据结构,用于快速找出某个列中有一特定值的行。
通过上述定义可以理解索引三个基本特性:
1、索引的作用是为了追求高效查找;
2、索引是一种数据结构,且是有序的;
3、索引用于快速查找某一个特定值的行(非特定值情况,即模糊匹配的情况是无效的)。
不使用索引,MySQL必须从第一条记录开始读完整个表,直到找到相关的行,表越大,查询数据所花费的时间就越多(全表扫描)。如果表中查询的列有一个索引,MySQL能够快速到达一个表搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
1.1 隐式索引
隐式索引由数据库服务器在创建某些对象的时候自动生成。例如,对于主键约束和唯一约束,数据库服务器就会自动创建索引。
之所以会存在隐式索引,是因为数据库总是优先考虑使用索引的这种情况,除非索引失效,但是前提是需要有字段建立索引,如果用户不手动显式指定索引字段,那么数据库就自动添加一个。一切都是为了尽可能的将能优化的情况都考虑到。
1.2 特点
优点:
1、提高数据检索效率,降低数据库的IO成本;
2、通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
缺点:
1、实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是要占空间的(空间换时间);
2、虽然索引大大提高了查询速度,同时会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE操作。
1.3 应用场景
需要创建索引:
1、主键自动创建唯一索引
2、频繁作为where查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系建立索引
4、查询中排序的字段(order by),排序的字段若通过索引区访问将大大提高排序速度
5、查询中统计或者分组字段(group by)
注:order by/group by是先做排序再分组,因此可以建索引
不需要创建索引:
1、频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
2、WHERE条件里用不到的字段不创建索引
3、表记录太少,即小的数据表不应当使用索引
4、经常增删改的表
5、如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果
6、数据值分布比较均匀的不适合建索引,比如性别
7、如果列中包含大数或者NULL值,不宜创建索引
02 分类
2.1 根据索引字段
1、单值索引
单值索引即一个索引只包含单个列,一个表可以有多个单列索引。
2、复合/联合索引
一个索引包含多个列,例如:INDEX Multidx(id,name.age)。
创建单列索引还是复合索引,要看每次查询中,哪些列在作为过滤条件的WHERE子句中最常出现。
如果只需要一列,那么就应当创建单列索引。如果作为过滤条件的WHERE子句用到了两个或者更多的列,那么复合索引就是最好的选择。
2.2 根据索引字段类型
1、主键索引/聚簇索引
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引总是把数据行存储在叶子页中(即数据和索引都存储在叶子节点),因此一个表中只能有一个聚簇索引。
对于上述聚簇索引结构,主键a为索引,则叶子节点就是最终的数据存储节点,查找到叶子节点也就对应找到了对应的数据了。
并不是所有的存储引擎都支持聚簇索引。
InnoDB只有一个聚集索引: