MySQL索引篇

1、定义:

​ MySQL官方对索引的定义为:“索引是帮助MySQL高效获取数据的数据结构。”可以得到索引的本质是数据结构。可以理解为:索引是帮助MySQL高效获取数据的排好序的数据结构。索引往往以索引文件的形式存储在磁盘上。我们平常所说的索引,如果没有特别说明,都是指B树(多路索引树)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引的默认使用都是B+树索引,当然除了B+树索引外,还有哈希索引等。

2、优劣势:

​ 优势:

  1. 提高数据检索的效率,降低数据库的IO成本.
  2. 通过索引树排序,降低数据排序的成本,降低CPU的消耗。

​ 劣势:

  1. 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表记录。索引索引也要占用空间。
  2. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行UPDATE、INSERT和DELETE。
  3. 因为更新表时,MySQL不仅要保存数据,好像更新索引。
  4. 索引只是提高效率的一个因素。

3、MySQL索引分类

  1. 单值索引 --即只包含单个列,一个表可以有多个单值索引
  2. 唯一索引 --索引值必须唯一,但允许有空值
  3. 复合索引 --即一个索引包含多个列

4、索引的选择

​ 4.1 适合索引的情况:

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 查询中排序的字段,排序字段若通过索引去访问讲大大提高排序速度
  5. 查询中统计或者分组字段

​ 4.2不适合索引的情况:

  1. 表记录太少
  2. 经常增删改的表,
  3. 数据重复且分布平均的表字段,如性别。

5、索引的数据结构

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有
Hash索引B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现
为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大
多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部
分场景,建议选择BTree索引。

MyISAM索引文件和数据文件是分离的(非聚集)

  1. 索引

    mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方
    式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B
    树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持
    BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树
    实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

  2. B+tree性质:

    1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
    2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指
    针,且叶子结点本身依关键字的大小自小而大顺序链接。
    3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最
    小)关键字。
    4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
    5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

  3. B-tree

    • 叶节点具有相同的深度,叶节点的指针为空
    • 所有索引元素不重复
    • 节点中的数据索引从左到右递增排列

    image-20210521163859137

  4. B+树

    • •非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
    • 叶子节点包含所有索引字段
    • 叶子节点用指针连接,提高区间访问的性能

    image-20210521164140882

  5. hash表

    简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在
    mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址
    法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成
    定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生
    Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式
    存储。当然这只是简略模拟图。

    image-20210521164549107

6、索引的实现

6.1 InnoDB索引实现(聚集)

        1. 表数据文件本身就是按B+Tree组织的一个索引结构文件
           2. 聚集索引-叶节点包含了完整的数据记录

image-20210521164755355

image-20210521164800381

6.2 MyISAM索引文件和数据文件是分离的(非聚集)

image-20210521164907787

posted @ 2021-06-28 20:23  浅蓝色丶  阅读(57)  评论(0)    收藏  举报