位置:编程技术网 > 架构设计 > 正文 >

MySQL的B+树索引是如何生长的(3)

2021年09月15日 05:15来源:网络搜索手机版

活老鼠砸餐厅桌上,银色北伐军战袍在哪买,无线网关

3.聚簇索引、普通索引和覆盖索引

关于索引有一些常见的名词我们需要加以区分。

首先聚簇索引就是像我们上面看到的一棵树一样,它的叶子节点是一个个数据页,这些数据页中存放的都是数据表中每一行的完整数据,所以说如果B+树是以完整数据的数据页为叶子节点的,我们把这个索引树称为聚簇索引;如果一个索引的索引树,叶子节点不是以数据页为叶子节点的,就称为二级索引或普通索引。

聚簇索引和普通索引最大的区别就是,聚簇索引的叶子节点存放了数据行的完整数据,而二级索引叶子节点只有数据的部分字段。

而覆盖索引本身并不是一种索引,而是一种查询数据的方式,比如我们对表table中的字段name建立了索引,然后我们执行查询如:select name from table where name like '张%',此时直接从name字段对应的B+树种查询到对应的一批name值,然后直接就返回就行了,也就是说我们想要的字段name它本来就在索引上,我们直接通过二分法高效的从树上直接摘下来就行了,而这种查询方式就称为覆盖索引。

当然相比于覆盖索引方式,如果查询改为:select * from table where name like '张%',这就不是覆盖索引了,因为此时你不光要从索引树上找到具体的name,还要利用id值回表查询所有的字段。

4.索引的优缺点分析

索引的优点当然就是高效查询数据,索引将遍历链表的O(n)的查询时间复杂度优化为了O(logn)的时间复杂度。

但是索引的缺点也是很明显的,首先在时间角度上,它必须要求主键是要按顺序增长的,无序的主键会带来频繁的页分裂,影响效率;对数据库表的增删改操作的同时也需要维护索引,这部分的维护也是一块性能损耗点;在空间角度上:索引相关的数据和实际数据一样都是要占内存空间的。

所以索引虽然能够提高查询效率,但是同时也要承担它给我们的系统带来的性能损耗,从这点上来看索引并不是建的越多越好。

5.三个维度设计好索引

下面我们从以下三个维度优化下索引的设计

(1)首先我们从时间角度上

我们需要为了避免频繁的页分裂,需要尽可能使用主键自增长等方式,保证新增的数据页中的数据行的主键都是递增,避免不必要的页分裂带来的性能损耗和拖慢查询效率。

另外选择合适的字段作为索引字段也很重要,需要选择基数较大的字段,也就是一个字段可能出现的值比较多,这样我们在B+树中查询时,才能最高效的发挥出二分法查询的威力,如果建立索引的字段基数比较小可能查询时二分查找就会退化成时间复杂度为O(n)的线性查询了。

(2)空间的角度上

因为索引数据本身也是要占空间的,可以选择字段长度较小的作为索引字段,这样整棵B+树不至于那么占空间。

但是如果非得要以长字段作为索引也不是不行,可以采用折中的以字段的前缀作为索引,这样的索引也称为前缀索引,但是这样可能只能用在模糊查询上了,用在group by和order by上就不太适合了。

(3)作用范围上

当然我们设计索引的目的,当然是为了更好的用上索引,索引在设计时,尽可能让where、group by、order by这些语句都能用上索引。

6.面试题剖析

1.InnoDB的索引数据结构是什么?为什么用这种数据结构?

2.聚簇索引、普通索引区别是什么?

3.什么是回表操作?它对索引有什么影响吗?

END

本文地址:http://www.reviewcode.cn/jiagousheji/239585.html 转载请注明出处!

今日热点资讯