索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。对于数据库的表而言,索引其实就是它的“目录”。
索引的常见模型
哈希表
是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。缺点不是有序的,所以哈希索引做区间查询的速度是很慢的。所以,哈希表这种结构适用于只有等值查询的场景。
有序数组
有序数组区间查询可以用二分查找非常快,但是更新要挪动的数据太大,所以有序数组索引只适用于静态存储引擎。
二叉搜索树
二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。所以也是有序的,可以使用二分查找。查询和更新的时间复杂度也都是 O(log(N))。
但是实际上大多数的数据库存储却并不使用二叉树,而是用N叉树,因为索引不止存在内存中,还要写到磁盘上。二叉树数据块会分很多,树更深,在机械硬盘时代寻址次数太多会很慢。
InnoDB 的索引模型
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又因为前面我们提到的,InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。
索引维护
自增主键防止页分裂,逻辑删除防止页合并。主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。所以,从性能和存储空间方面考量,自增主键往往是更合理的选择。
还是有的场景适合用业务字段直接做主键:
- 只有一个索引。
- 该索引必须是唯一索引。
就是典型的 KV 场景。由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。这时直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。
此文章为 6 月Day4学习笔记,内容来源于 极客时间《MySQL实战45讲》。