深入浅出索引(下)

深入浅出索引(下)


仅作为笔记,码字不易,转载请标明出处。


前言

仅作为笔记


一、深入浅出索引(下)

怎么才能用好索引?

我们已经知道索引是一种特殊的数据结构(常见的有哈希表、有序数组、二叉平衡搜索树、N叉树、B+树),它的使命就是加快数据查询的效率。不过一张表她的字段不止一个,需要查询的方式也非常丰富,为了适应丰富的查询场景,索引自身也进行了进化,于是有了(针对MySQL innoDB)

0:每个索引对应一棵B+树(N叉有序树,且数据存储在叶子节点之中),主键索引树有点特殊,一定存在且叶子节点存储的是数据记录,普通索引树的叶子存储的是主键索引的值。

1:主键索引-必须有,你不建数据库也会默认创建,也可以包含多个字段,这多个字段怎么存放和排列的呢?从文中和评论中看到,索引项是按照索引定义的顺序来排序的,比如:(a,b,c)三个字段组成一个联合索引,在实际存储的时候会按照先排序a再排序b最后排序c的方式来存储。

2:普通索引-一棵B+树,叶子节点存储主键索引的值,查询数据时需要回表主键索引树来查询具体行信息。

3:覆盖索引-索引优化方式之一,通过减少回表来提高查询速度,注意前提条件是覆盖索引树中的数据项覆盖住了查询项,包括:条件列和查询列

4:联合索引-多个字段组成一个索引,注意,索引项的顺序是按照索引定义的排列顺序来排序的,定义索引时的顺序原则如下:如果能够调整顺序,可以少维护一个索引,那么这个索引创建顺序就应该是被优先考虑采纳的。这样建立的索引,能够充分的利用最左前缀原则来提高查询的效率。

5:最左前缀原则-利用索引来加快数据检索的效率,不仅能够利用索引的全部定义,另外只要满足最左前缀原则也是可以的,最左前缀具体指联合索引的最左N个字段或者字符串索引的最左M个字符。

这里有个疑问?最左前缀的底层是怎么实现,猜测是遍历组合索引B+树的时侯,仅比较组合索引的最左部分,如果是这样,比较最左或最右或中间是否差不多?如果差不多,那用like的话,是不是可以提供更广范围的索引支持?

6:索引下推优化-MySQL5.6之后推出的,也是通过减少回表的次数来提高检索性能的。原理是在遍历过程中,对索引中的包含的字段先进行判断,直接过滤掉不满足条件的记录,依次来减少回表的次数。

7:模糊查询like也并非完全不走索引,如果是like语句后面的%百分号在后面则是可以走索引而不是全盘扫描的。

8:覆盖索引
如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
性能优化的原则是通用的:

1:办成事,但是要想方设法少干活

2:不得不干,就让快的多干慢的少干

3:时刻记住1和2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值