HASH索引&&B-树&&B+树&&B*树

HASH索引
在这里插入图片描述
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

*1、hash索引是基于hash表实现的,只有查询条件精确匹配hash索引中的所有列的时候,才能用到hash索引。

2、对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引中存储的就是hash码。

3、hash索引包括键值、hash码和指针 。

4、hash索引不支持部分索引查找也不支持范围查找,只能用到等值查询,不能范围和模糊查询

5.hash索引中的hash码的计算可能存在hash冲突

6.以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

7.在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

哈希索引也没办法利用索引完成排序

二叉搜索树
二叉排序树
二叉搜索树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
在这里插入图片描述

在这里插入图片描述

二叉搜索树在经过多次插入与删除后,有可能导致不同的结构
在这里插入图片描述

(B树)B-树
是一种多路搜索树(并不是二叉的)
(B)B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点; 所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
在这里插入图片描述
B+树
B+树是B-树的变体,也是一种多路搜索树;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
在这里插入图片描述

B*树
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;
在这里插入图片描述
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分

MyISAM索引实现
在这里插入图片描述
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
假设我们以Col1为主键,图myisam1是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。

辅助索引(Secondary key)
在这里插入图片描述
***在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复***同样也是一颗B+Tree,data域保存数据记录的地址。
我们在Col2上建立一个辅助索引

MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
索引–>地址->数据记录

InnoDB索引实现
InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

主键索引
在这里插入图片描述
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做聚集索引(聚簇索引)

因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形

InnoDB的辅助索引
在这里插入图片描述
InnoDB的所有辅助索引都引用主键作为data域。InnoDB 表是基于聚簇索引建立的
因此InnoDB 的索引能提供一种非常快速的主键查找性能。

它的辅助索引(Secondary Index, 也就是非主键索引)也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。

InnoDB 不会压缩索引

二次查询问题
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

主索引查询:
索引—>数据记录

辅助索引查询:
索引—>主键—>数据记录

InnoDB索引和MyISAM索引的区别
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

注意

  1. 不建议使用过长的字段作为主键
    因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

  2. 不建议在InnoDB中用非单调的字段作为主键,建议使用自增字段作为主键
    InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整.

借鉴于

https://blog.csdn.net/qq_22613757/article/details/81218741
https://blog.csdn.net/hguisu/article/details/7786014
https://www.cnblogs.com/heiming/p/5865101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷学习被我发现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值