MySQL索引

一、索引模型

哈希表

键值对,其中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 索引树上了,因此可以直接提供查询结果,不需要回表。这个就叫做覆盖索引,由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

四、索引下推

其实就是根据联合索引中的值,减少回表。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值