MySql 索引详解(1)

MySql 索引详解

索引介绍

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

​ 索引的作用就相当于书的目录,打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢,如果有目录了,我们只需要先去目录里查询字的位置,然后直接翻到那一页进行查询

​ 索引底层数据结构存在很多种类型,常见的索引结构有:B+树,B树和 Hash、红黑树。在 MySql 中,无论是 Innodb 还是 MyIsam ,都是使用 B+树作为索引结构。

索引的优缺点

优点:

  • 使用索引可以大大加快数据的检索速度(大大减少检索的数据量),这也是创建索引的最主要原因。
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

缺点:

  • 创建索引和维护索引需要耗费许多时间。当对表中数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 的执行效率
  • 索引需要使用物理文件进行存储,也会耗费一定的空间。

索引底层数据结构选型

Hash 表

​ 哈希表是键值对的集合,通过键即可快速取出对应的值,因此哈希表可以快速检索数据(接近O(1))。其底层是基于哈希算法来实现的

​ 但是哈希算法有哈希冲突的问题,也就是说多个不同的 KEY 最后得到的 Index 相同。通常情况下,我们常用的解决方法是 链地址法 。链地址法就是将哈希冲突的数据存放在链表中,就比如 JDK 1.8 之前的 HashMap 就是通过链地址法来解决哈希冲突问题的。

​ 为了减少哈希冲突的可能性,一个好的哈希函数应该均匀的将数据分布在整个可能的哈希值集合中。

​ MySql 的 InnoDB 存储引擎不直接支持常规的哈希索引,但是,InnoDB 存储引擎中存在一种特殊的自适应哈希索引,它并不是传统意义上的纯哈希索引,而是结合了 B+Tree 和哈希表的特点,以便更好的适应实际引用中的数据访问和性能需求,自适应哈希索引的每一个哈希桶实际上都是一个小型的 B+树结构,可以存储多个键值对,而不仅仅是一个键,这有助于减少哈希冲突链的长度,提高了索引的效率。

​ 既然哈希表这么快,为什么我们不选用哈希表作为 MySql 的默认索引呢。主要是哈希索引不支持顺序和范围查询,试想:

SELECT * FROM tb1 WHERE ID < 500;

​ 在这种范围查询中,优势非常大,直接遍历比 500 小的叶子节点就够了。而 Hash 索引是根据 hash 算法来定位的,难不成还要把 1 - 499 的数据,每个都进行一次 hash 计算来定位吗?这就是 Hash 最大的缺点了.

二叉查找树

​ 二叉查找树(Binary Search Tree)是一种基于二叉树的数据结构,它具有一下特点:

  1. 左子树的所有节点的值均小于根节点的值
  2. 右子树的所有节点均大于跟节点的值。
  3. 左右子树也分别为二叉查找树

​ 当二叉查找树是平很的时候,也就是树的每个节点的左右子树深度相差不超过1的时候,查询的时间复杂度为 O(Log2(N)) 具有比较高的效率。然而,当二叉查找树不平衡的时候,例如在最坏情况下,树会退化成线性链表,导致查询效率急剧下降,时间复杂度退化为 O(N)。

​ 也就是说,二叉查找树的性能非常依赖于它的平衡程度,这就导致其不适合作为 MySql 底层索引的数据结构。

B 树 & B+ 树

​ B 树也称 B- 树,全称为 多路平衡树,B+ 树是 B 树的一种变体。B 树和 B+ 树中的 B 是 Balanced 平衡的意思

​ 目前大部分数据库系统及文件系统都采用 B- Tree 或其变种 B+ Tree 作为索引结构。

B 树 & B+ 树有何不同

  • B 树的所有节点既存放 KEY 也存放 VALUE, 而 B+ 树只有叶子节点存放 KEY 和 VALUE,其他内节点只存放 KEY。
  • B 树的叶子节点都是独立的;B+ 树的叶子节点有一条引用链指向与它相邻的叶子节点。
  • B 树的检索过程相对于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+ 树的检索很稳定,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
  • 在 B 树中进行范围查询时,首先要找到查找的下线,然后对 B 树进行中序遍历,知道找到查找的上线;而 B+树的范围查询,只需要对链表进行遍历即可。

综上,B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值