1. 索引及其优缺点

1.1 索引概述

索引是帮助Mysql高效获取数据的数据结构。``

1.2 优点

  1. 提高数据检索效率,降低数据库的IO成本
  2. 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
  3. 在实现数据的参考完整性方面,可以加速表和表之间的连接。即对于有依赖关系的子表和父表联合查询时,可以提高查询速度
  4. 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低CPU的消耗

    1.3 缺点

  5. 创建和维护索引要耗费时间,随着数据量的增加,所耗费的时间也会增加

  6. 索引需要占磁盘空间,除了数据表占数据空间之外,每个索引还要站一定的物理空间,存储在磁盘上,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸
  7. 虽然索引大大提高了查询速度,同时却会降低更新表的速度。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

    2.索引的数据结构

    image.png
    image.png

image.png
image.png
image.png

3.常见索引概念

索引按照物理实现方式,索引可以分为 2 种:聚簇(聚集)和非聚簇(非聚集)索引。我们也把非聚集
索引称为二级索引或者辅助索引。
image.png

3.1 聚簇索引

特点:

  1. 使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:
  • 页内的记录是按照主键的大小顺序排成一个单向链表
  • 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表
  • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表
  1. B+树的叶子节点存储的是完整的用户记录。所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列).

优点:

  • 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
  • 聚簇索引对于主键的排序查找范围查找速度非常快
  • 按照聚簇索引排序顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以节省了大量的io操作

缺点:

  • 插入速度严重依赖于插入顺序,按照主键的顺序插入时最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
  • 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新
  • 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据

    3.2 非聚簇索引(辅助索引、二级索引)

    概念:回表我们根据这个以c2大小排序的B+树只能确定我们要查询记录的主键值,所以如果我们想根据c2列的值
    查找到完整的用户记录的话,仍然需要到聚簇索引中再查一遍,这个过程称为回表。也就是根据c2列的值查询到
    一条完整的用户记录需要使用到2颗B+树!

    3.3 联合索引

    我们可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照c2和c3列的大小进行排序,这个包含两层含义:

  • 先把各个记录和页按照c2进行排序

  • 在记录的c2列相同的情况下,采用c3列进行排序

注意一点,以c2和c3列的大小为排序规则建立的B+树称为联合索引,本质上也是个二级索引。它的意思与分别为c2列和c3列分别建立索引的表述是不同的,不同点如下:

  • 建立联合索引只会建立如上图一样的1颗B+树
  • 为c2和c3列分别建立索引会分别以c2列和c3列的大小为排序规则建立2颗B+树

    3.4 InnoDB的B+树索引的注意事项

  1. 根页面位置万年不动
  2. 内节点中目录项记录的唯一项
  3. 一个页面最少存储2条记录