Mysql索引优化相关问题 | 青训营笔记

71 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Mysql学习

1. Mysql索引是用什么实现的?

 Mysql的索引可以由hash表实现和B+树实现。hash表实现的索引在实现单数据查询时可以实现O(1)的查找效率,并且添加,删除的效率也很高。但是使用hash表实现的数据库表不能实现诸如in,>,<,like这样的范围查询。因为hash表的存储方式本身就是离散的,而范围查询要求是连续的,如果使用hash表方式实现的数据库表实现范围查询效率会很低下,所以Mysql开发者禁止用户在索引使用hash方式存储的数据库表中使用范围查询。InnoDB中B+树实现的数据库表通常是三层,非叶子结点存储的是索引信息,最后一层存储的是索引信息和卫星数据,卫星数据也可以理解为实际数据和一些列的溢出页数据的指针的集合。并且B+树的所有叶子结点会构成一个有序的双向链表,所以可以有效的支持范围查找。

2. Mysql存储引擎为什么不使用B树而选择B+树实现?

(1) 首先我们要了解以下二者的存储结构,B树:

①一颗m阶的B树最多有m-1个索引

②根节点最少可以只有1个关键字

③非根节点至少有m/2 - 1个关键字

④每个结点中的索引都是有序的且左子树中的索引都小于当前索引,右子树中的索引都大于当前索引

⑤所有根节点到叶子结点的长度都相同。

B+树:①有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

②所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,并且所有叶子结点形成有序的双向链表。

③所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

 

所以B+树相较于B树的优点是:

①B树相较于B+树而言因为其非叶子结点也能够携带数据的原因,使得在同样的内存空间下B树加载的索引数量是远远不如B+树的,而我们知道执行引擎在执行查询时,如果有索引的情况下是通过页来加载索引树的,一次默认为16KB,这就使得B+树一次性I/O能够加载入更多的索引,从而减少I/O次数

②所有查询都需要查找到叶子结点才能获得数据,查询性能较稳定。

③所有的叶子节点形成有序的双向链表,有利于范围查询。

 

3. 为什么数据库表推荐使用自增整数型主键?

(1) 首先解释为什么使用自增的主键,原因是数据库表底层会维护一个B+树实现的索引表来加快查询的速度,而生成B+树的过程中,是推荐在树中追加最大元素的而不是插入元素,因为在B+树中追加元素仅需直接追加即可,最大代价无非是造成B+树的分裂,而在B+树中插入一个中间元素很可能导致B+树的整个结构发生重构,这个过程是非常耗时的。

(2) 另外就是使用整数型,因为整数型相较于字符型方便比较,因为在查询的过程中,可能要经过非常多次的比较操作,整数型的比较无疑要比字符型的比较效率高。

参考资料

blog.csdn.net/u011436427/…