一、索引模型
哈希表
键值对,其中key是通过特定的哈希函数得到的,相同的key,不同的value,此时会拉出一个链表。等值查询非常快,区间范围查询比较慢。
有序数组
等值查询和范围查询性能很好,但是在插入数据的时候代价比较高,只适合静态存储引擎(不会再修改的数据)
二叉搜索树
每个节点的左儿子小于父节点,父节点又小于其右儿子。更新的复杂度是log(N),搜索效率很高,但是大多数数据库存储不使用二叉树,因为索引不止存在内存中,还要写到磁盘中,为了让查询尽量少的访问数据块,我们使用N叉树,其中N取决与数据块的大小。
二、InnoDB的索引模型
在InnoDB中,使用了B+树索引模型,数据都是存储在B+树中的。每一个索引在InnoDB里面对应一颗B+树。
主键索引
通过主键ID查询方式,只需要搜索ID这颗B+树。
普通索引
如果是对K字段(非主键)进行查询,也就是普通索引查询,那么先搜索K索引树,得到ID,再到ID索引树搜索一次,这个过程称为回表。
索引维护
挪数据:当前ID为3,插入一个ID为4的新值,只需要在ID为3的记录后面插入,但是如果要插入一个ID为2的,就需要逻辑上挪动数据。
页分裂:数据页满了,根据B+树的算法,需要申请一个新的数据页,然后挪动数据过去,性能会受到影响,还会影响数据页的利用率(原本放在一个页的数据放到两个页中)。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。
三、覆盖索引
如果执行的语句是
select ID from T where k between 3 and 5
这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。这个就叫做覆盖索引,由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
四、索引下推
其实就是根据联合索引中的值,减少回表。
10万+

被折叠的 条评论
为什么被折叠?



