索引简介

什么是索引

索引是一种用于快速查询和检索数据数据结构

常见的索引结构有:

  • B+树
  • Hash

索引就相当于是我们所使用字典的目录,我们可以通过目录轻松找到想要查找的字词的位置。

索引的优缺点

  • 优点:

    可以通过减少检索的数据量来大大加快检索速度

    可以通过创建唯一性索引保证数据库中每一行数据的唯一性

  • 缺点:

    创建索引和维护索引需要耗费许多时间

    占用物理内存

B+树索引和Hash索引

B树、B+树扫盲

  • B树

    • 基本原理:

      二叉查找树的升级版,改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数(解决了当数据量十分庞大时平衡二叉树深度过深的问题)

    • image-20200423153702081

    • 在搜索B树时,很明显,访问节点(即读取磁盘)的次数与树的高度呈正比

  • B+树

    • B+树是B树的一种变形,它更适合实际应用中操作系统的文件索引和数据库索引
    • B+树的叶子节点有一条引用链指向与它相邻的叶子节点
    • image-20200423154336991
  • B树和B+树的比较:

    B树 B+树
    子树的个数总比关键字个数多1个 关键字的个数与其子树的个数相同
    所有节点既存放 键(key) 也存放 数据(data) 只有叶子节点存放 key 和 data,其他内节点相当于索引
    可能未到达叶子节点检索就结束了 检索效率稳定,任何查找都是从根节点到叶子节点的过程

哈希索引和B+树索引的比较

哈希索引 B+树索引
哈希索引对单个数据定位较快 哈希索引对单个数据定位较慢
不支持顺序查询 支持顺序查询(叶子节点相连)
不支持范围查询 支持范围查询

总结:

​ 在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;

​ 其余大部分场景,建议选择B+Tree索引。

索引类型

主键索引和辅助索引

  • 主键索引(Primary Key):
    • 数据表的主键列使用的就是主键索引。
    • 一张数据表有只能有一个主键,并且主键不能为null,不能重复。
  • 辅助索引(二级索引):
    • 二级索引的叶子节点存储的数据是主键,通过二级索引,可以定位主键的位置。
    • 唯一索引,普通索引,前缀索引等索引属于二级索引。
    • image-20200423160344472

聚集索引与非聚集索引

  • 聚集索引:聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。

    优点:查询速度非常快

    缺点:

          1. 依赖于有序的数据
            2. 更新代价大
    
  • 非聚集索引:索引结构和数据分开存放的索引。二级索引属于非聚集索引。

    优点:更新代价小

    缺点:

      1. 依赖于有序的数据
       2. 可能会二次查询(**回表**)
    
image-20200423161249338
  • 非聚集索引一定回表查询吗?(覆盖索引)

    不一定,当索引的key本身就是查询的字段的时候,无需回表!

索引创建注意点

原则

最左前缀原则:在创建联合索引时,尽量把查询最频繁的那个字段作为最左(第一个)字段。查询的时候也尽量以这个字段为第一条件。

适合创建索引的字段

  1. 不为Null的字段
  2. 被频繁查询的字段
  3. 被作为条件查询的字段
  4. 被经常用于连接的字段

不适合创建索引的字段

  1. 被频繁更新的字段

  2. 不经常查询的字段

参考

格物:https://shockerli.net/post/1000-line-mysql-note/

javaGuide:https://snailclimb.gitee.io/javaguide/#/docs/database

guoziqing506:https://blog.csdn.net/guoziqing506