011、索引的认识

MySQL索引的转变过程
MySQL的索引可以理解为书的目录。

二叉树索引

索引最开始是二叉树的结构,利用二分查找法,折半查找法查找数据。
二分查找法,折半查找法(binary search):一种在有序数组中查找某一特定元素的搜索算法;
例如:一组数字为1 - 50,现在想查找数字10。取中间值10在25的左边区间中,在1 - 25中,再次取中间值12。数字10在12的左边区间中,最后在1 - 12中查找。(小于中间值的放在左侧,大于中间值的放在右侧)。
  • 二分查找法的优点:比较次数少,查找速度快,平均性能好;
  • 二分查找法的缺点:要求待查表为有序表,且插入删除困难。
所以,折半查找方法适用于不经常变动而查找频繁的有序列表;
在二分查找法的基础上,产生了二叉树(binary tree)索引。
中间节点(主节点)下有2个子节点,向下,二叉树的每个节点至多只有二棵子树,二叉树的子树有左右有序之分,次序不能颠倒(结合二分查找法的示例)。

平衡二叉树索引

一般的二叉查找树的查询复杂度是跟目标节点到树根的距离有关。
因此当节点的深度普遍较大时,查询的均摊复杂度会上升,为了更高效的查询,出现了平衡树,升级产生了改进的二叉查找树:平衡二叉树索引(balance tree)。
平衡二叉树的特点:
  1. 它是一颗空树或其左右两个子树的高度差的绝对值不超过1,且左右两个子树也是平衡二叉树。
  2. 不平衡树会通过自旋,变成平衡树。原理是通过取中间值,来展开分支,在分支下挂一个小值和一个大值。
  3. 平衡树和二叉查找树最大的区别:前者是平衡的,后者未必。

B树索引

在平衡二叉树的基础上,产生了B树索引,B树,balanced tree,又称 B-树。
B树,一个节点可以拥有多于2个子节点的多叉查找树适合大量数据的读写操作,普遍运用在数据库和文件系统。
一颗m阶的B树满足条件:
1,树中每个节点至多有m个子节点
2,除根节点和叶子节点外,其它每个节点至少有m/2个子节点
3,若根节点不是叶子节点,则至少有2个子节点
4,所有叶子节点都出现在同一层,叶子节点不包含任何键值信息
5,有k个子节点的非叶子节点恰好包含有k-1个键值。
叶子节点:在整个B-树结构的最后一层。
非叶子节点:除了根节点和叶子节点,其余的节点。又叫索引节点。
下图是4阶的B-tree结构图:

B + 树索引

B+树,B+tree,是MySQL数据库使用的一种索引。
B+树是B树的变体,也是多路搜索树,其定义基本与B树相同,除了以下几点:
  1. 有n棵子树的节点中含有n-1关键字key,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。
  2. 所有的叶子节点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接。
  3. 所有的非叶子节点可以看成是索引部分,节点中仅含其子树中的最大或者最小关键字。
  4. 在mysql中,为了方便,直接写成Btree
注意:在MySQL里,B+树索引,在文档或者SQL语法中,是以BTREE方式出现的。
B+树结构中,叶子节点包含了所有的键值信息,而且叶子节点间的子节点,都有指向下一个叶子节点的指针。
B+树结构中,子节点间的指针是双向的,又称双向链。B+树索引的检索速度比B-树的检索速度快很多。


hash索引

建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找(等值查询)有用。
在hash表的基础上计算出来一个固定值,针对innodb,myisam存储引擎来说,本身并不支持hash功能,自适应hash index是数据库创建的。
1.对于每一行,存储引擎计算出了被索引的哈希码code(所以只支持精确查找),它是一个较小的值,并且有可能和其他行的哈希码不同。
2.把哈希码保存在索引中,并且保存了一个指向哈希表中的每一行的指针。
3.散列索引。


B+树索引  VS  哈希索引
1.大量不同数据等值精确查询,hash索引效率通常比B+tree高;
2.hash索引不支持模糊查找;
3.hash索引不支持联合索引中的最左匹配规则;
4.hash索引不支持排序;
5.hash索引不支持范围查询;

mysql:
只有MEMORY引擎支持hash index类型,hash index只能用于等值查询。




posted @ 2021-06-16 17:27  有点菜大人  阅读(138)  评论(0)    收藏  举报