![902de7340835ca6b553934dcae32fbea.png](https://i-blog.csdnimg.cn/blog_migrate/458a8173b3c91af2fd7994e6b0fa273a.jpeg)
MySQL 学习记录第四篇,本文来聊聊索引以及索引的数据结构。
啥是索引?
打个比方,我们看书时候,为了能快速找到想看的内容在哪一页,我们可以查看目录。对于数据库来说,为了提高效率,在茫茫多的数据中找到符合我们想要条件的那些条数据,就需要使用索引来快速查询。索引就好比书的目录,如果没有索引,那找起来可就费时间了。
索引的数据结构模型
数据结构是一门很重要的课程,大学中学过这门课的人应该会有印象,索引是由树构成的。其实树只是一种,本文来介绍三种常见的、也比较简单的数据结构:哈希表、有序数组和搜索树。
接下来我会从使用的角度,来分析下这三种数据结构模型的区别~
哈希索引
哈希表是一种以键值(key-value)对存储的数据结构。在查找时,输入待查找的键(key),就能找到对应的值(value)。哈希的原理就是把值放入数组里,用哈希函数将 key 换算成一个确定的位置,然后把 value 放入数组的这个位置里。
多个 key 值通过哈希函数计算,是有可能出现计算出同一个结果的情况。这时候,就要使用链表结构。
![5277c3b939a9f797bd8655585f507dbe.png](https://i-blog.csdnimg.cn/blog_migrate/246cc1f2ee5135b5be073f959d78a72e.jpeg)
如图所示,图中 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](https://i-blog.csdnimg.cn/blog_migrate/d05b5c386bf8e2513ae88be2c0d0ab6f.png)
二叉搜索树的特点是:每个节点的左儿子节点小于父节点,右儿子节点大于父节点。比如要查到图中 7 这个值,就要按照顺序 8 -> 3 -> 6 -> 7。时间复杂度是 O(log(N))。数据结构课程中讲过,为了保持这个树的时间复杂度,需要保持这个树是平衡二叉树(AVL),更新操作就是我们熟知的 AVL 旋转操作。
当然有二叉树,就会有多叉树。多叉树就是一个父节点有多个子节点,儿子节点的大小保证从左往右递增。
实际上,大部分的数据库存储并不使用二叉树,而是使用多叉树。这是为了让一个查询尽量少地读磁盘,也就是少访问几次节点,降低树的高度。树的根节点总是在内存中,第二层有很大概率也在内存中,故使用多叉树降低树的高度,就可以减少访问磁盘的次数,在性能上实现优化。这也就是 N 叉树索引的原理。
好的,本文就到这里。回顾下,本文介绍了索引的概念以及三种常用的索引数据结构,包括哈希表、有序数组和 N 叉树。理解了索引结构,有利于我们合理正确的使用索引。