MySQL索引小结

MySQL索引

索引介绍

索引的出现其实是为了提升数据的查询效率,就像书的目录一样。

常见的索引模型

索引的出现是为了提高查询效率,但是实现索引的方式有很多种,所以就引入了索引模型的概念。索引模型的本质是一种数据结构,目的是为了数据的读写速度。

哈希表

哈希表是一种以健-值存储的数据结构,我们只需输入需要查找的key 就能找到其对应的value。哈希表就是使用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。其底层依靠数组存储。

哈希冲突问题:多个key经过hash函数计算得到同一个位置,处理这种情况的方法就是使用链表法。

特点:因为hash表对与等值查询有很高的效率,但是因为hash表的数据是无序存储的,所以对于范围查询场景就需要遍历所有的数据 ,O(N)的时间复杂度。

总结:哈希表这种数据结构适用于等值查询的场景。

有序数组

有序数组 在等值查询和范围查询场景中的性能都非常优秀。但是如果数据在中间位置的增、删、改等操作,为维护数据的有序性就涉及到数据的搬移操作。O(N)的时间复杂度成本较高。

总结:有序数组只适用于静态存储引擎,如历史静态数据,这类不需要后期修改的数据。

二叉树

二叉树是经典的数据结构,查询的时间复杂度O(log(N)),为了维护这个查询复杂度就需要保持这颗树是平衡二叉树,更新的时间复杂度也是O(log(N))

B+Tree

在MySQL中索引是存储引擎层实现的。Innodb存储引擎在mysql中使用最为广泛,我们就一起学习下innodb的索引模型 B+Tree。

在innodb中表是根据主键顺序以索引的形式存放的,这种存储方式的表称之为索引组织表。

每个索引在innodb中对应一颗B+Tree。主键索引的叶子节点存放的是整行数据,这种数据和索引一起存放的索引也称之为聚簇索引。非主键的叶子节点存放的是主键的值,也称为二级索引。显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。

自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

索引特性

回表

先搜索二级索引树获取到主键值,然后通过主键值再去主键索引树获取数据的过程,我们称之为回表。

索引覆盖

如果执行的语句是 select ID from T where k =3,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。

索引覆盖能减少树的搜索次数,能够显著提升查询性能。

最左匹配原则

对于mysql的联合索引,比如 (name,age,sex) 的时候,b+ 树是按照从左到右的顺序来建立搜索树的,比如当 (张三,20,男) 这样的数据来检索的时候,b+ 树会优先比较 name 来确定下一步的所搜方向,如果 name 相同再依次age 和 sex,最后得到检索的数据。因为建立搜索树的时候 name 就是第一个比较因子,必须要先根据 name 来搜索才能知道下一步去哪里查询。这种从左到右查询数据的方式就是最左匹配。

最左匹配能有效的减少索引树的数量,节省空间。

索引下推

Index Condition Pushdown,简称 ICP。 是Mysql 5.6版本引入的技术优化。旨在 在“仅能利用最左前缀索的场景”下(而不是能利用全部联合索引),对不在最左前缀索引中的其他联合索引字段加以利用——在遍历索引时,就用这些其他字段进行过滤(where条件里的匹配)。过滤会减少遍历索引查出的主键条数,从而减少回表次数,提示整体性能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值