深入浅出索引知识

本文介绍了索引在提高数据查询效率中的作用,包括哈希表和B+树的原理,以及主键索引和非主键索引的区别。重点讨论了覆盖索引和联合索引的应用,以及最左前缀原则在索引设计中的重要性。
摘要由CSDN通过智能技术生成
  • 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样

  • 索引模型

    • 哈希表

      • 哈希表是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即Value

      • 思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。

      • 多个key值经过哈希函数的换算,会出现同一个值的情况,解决方法

        • 解决方法

          • 链表

      • 哈希表这种结构适用于只有等值查询的场景

    • 有序数组

      • 在等值查询和范围查询场景中的性能就都非常优秀

      • 优劣势:查询效率,有序数组就是最好的数据结构;更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高;

      • 有序数组索引只适用于静态存储引擎

      • 查询方法:二分法就可以快速得到,

      • 时间复杂度是O(log(N))

    • 搜索树

      • 特点:每个节点的左儿子小于父节点,父节点又小于右儿子

      • 时间复杂度是O(log(N)) (前提:保持这棵树是平衡二叉树)

      • 为保证平衡二叉树,更新的时间复杂度也是O(log(N))

      • N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

  • innodb索引模型

    • 表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表

    • InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的

    • 每一个索引在InnoDB里面对应一棵B+树

    • 索引类型分为主键索引和非主键索引

      • 主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引

      • 非主键索引的叶子节点内容是主键的值。在InnoDB里,非主键索引也被称为二级索引

      • 基于主键索引和普通索引的查询有什么区别?

        • 基于非主键索引的查询需要多扫描一棵索引树

        • 过程:非主键索引先在在对应的索引树上搜索到自己的值,这个值存放的是主键值,然后根据这个主键值到主键的索引树上搜索到指定的记录。

  • 索引维护

    • B+树为了维护索引有序性,在插入新值的时候需要做必要的维护

    • 插入数据可能需要移动后面的数据,空出位置

    • 如果数据页满了,就还要进行新的数据页的申请,将多的数据移动过去,称为页分裂,性能自然会受影响,影响数据页的利用率

    • 当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。

    • 主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

    • 适合用业务字段直接做主键的场景

      • 只有一个索引

      • 该索引必须是唯一索引

  • 小结1

    • B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数。

    • 由于InnoDB是索引组织表,一般情况下我会建议你创建一个自增主键,这样非主键索引占用的空间最小。

    • 问题:

      • 重建主键索引和普通索引,说出对这两个的理解

        • 重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。就不需要对主键索引进行删除的操作。

        • 如果删除,新建主键索引,会同时去修改普通索引对应的主键索引,性能消耗比较大。

        • 删除重建普通索引貌似影响不大,不过要注意在业务低谷期操作,避免影响业务。

  • 回到主键索引树搜索的过程,我们称为回表

  • 索引覆盖

    • 索引已经“覆盖了”我们的查询需求,我们称为覆盖索引

    • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

    • 联合索引就是对索引覆盖一个很好的引用

      • 例子:如果现在有一个高频请求,要根据市民的身份证号查询他的姓名,这样的索引就满足覆盖要查询的字段,这样就提高了效率。

  • 最左前缀原则

    • B+树这种索引结构,可以利用索引的“最左前缀”,来定位记录。

    • 只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

    • 在建立联合索引的时候,如何安排索引内的字段顺序。

      • 评估标准:索引的复用能力

      • 第一原则是如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。

      • 考虑的原则就是空间

  • 索引下推

    • 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值