mysql数据结构_MySQL 索引的数据结构

902de7340835ca6b553934dcae32fbea.png

MySQL 学习记录第四篇,本文来聊聊索引以及索引的数据结构。

啥是索引?

打个比方,我们看书时候,为了能快速找到想看的内容在哪一页,我们可以查看目录。对于数据库来说,为了提高效率,在茫茫多的数据中找到符合我们想要条件的那些条数据,就需要使用索引来快速查询。索引就好比书的目录,如果没有索引,那找起来可就费时间了。

索引的数据结构模型

数据结构是一门很重要的课程,大学中学过这门课的人应该会有印象,索引是由树构成的。其实树只是一种,本文来介绍三种常见的、也比较简单的数据结构:哈希表、有序数组和搜索树

接下来我会从使用的角度,来分析下这三种数据结构模型的区别~

哈希索引

哈希表是一种以键值(key-value)对存储的数据结构。在查找时,输入待查找的键(key),就能找到对应的值(value)。哈希的原理就是把值放入数组里,用哈希函数将 key 换算成一个确定的位置,然后把 value 放入数组的这个位置里。

多个 key 值通过哈希函数计算,是有可能出现计算出同一个结果的情况。这时候,就要使用链表结构。

5277c3b939a9f797bd8655585f507dbe.png
哈希索引示意图

如图所示,图中 id 为 1 和 3 的 Alice White、John Doe 这两条数据,就都在数据的 153 这个位置上,两者以链表的方式连接:1->3。比如我们要查询 id = 3,则先通过哈希函数计算出该条记录在数组中的位置 153,然后拿到数据 id = 1 不是我们要找的,顺着链表继续往后查询,找到 id = 3。

注意,图中的 id 并不是递增的,故新增记录时,只需要往后追加即可。不过这样的无序排列,对于查询就不太友好了,哈希索引做查询的速度是很慢的。

所以,哈希索引适合做只有等值查询的业务

有序数组

有序数组就是按照索引字段数值,从小到大的顺序排列。这样的数据结构我们可以得知,有序数组非常适合做范围查询和等值查询,性能表现很好

比如在一个有序数组里查询一个 id,只需要使用二分法就可以快速得到,时间复杂度是 O(log(N))。

有序数组的缺点是插入记录成本太高,在中间插入一条记录就会导致它后面的记录都要在数组中往后移动。有序数组只适用于静态存储引擎,存储那些静态的不会再修改的数据最合适了。

N 叉树

讲 N 叉树之前,先说下课本中经典的二叉搜索树。

a7cc460d418927cf05b73d3ec5e71bc9.png
二叉树示意图

二叉搜索树的特点是:每个节点的左儿子节点小于父节点,右儿子节点大于父节点。比如要查到图中 7 这个值,就要按照顺序 8 -> 3 -> 6 -> 7。时间复杂度是 O(log(N))。数据结构课程中讲过,为了保持这个树的时间复杂度,需要保持这个树是平衡二叉树(AVL),更新操作就是我们熟知的 AVL 旋转操作。

当然有二叉树,就会有多叉树。多叉树就是一个父节点有多个子节点,儿子节点的大小保证从左往右递增。

实际上,大部分的数据库存储并不使用二叉树,而是使用多叉树。这是为了让一个查询尽量少地读磁盘,也就是少访问几次节点,降低树的高度。树的根节点总是在内存中,第二层有很大概率也在内存中,故使用多叉树降低树的高度,就可以减少访问磁盘的次数,在性能上实现优化。这也就是 N 叉树索引的原理。

好的,本文就到这里。回顾下,本文介绍了索引的概念以及三种常用的索引数据结构,包括哈希表、有序数组和 N 叉树。理解了索引结构,有利于我们合理正确的使用索引。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值