图解MySQL索引–B-Tree(B+Tree)「建议收藏」

图解MySQL索引–B-Tree(B+Tree)

大家好,又见面了,我是全栈君。

看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!

索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

索引能干什么?

提高数据查询的效率。

索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序。

一、索引的分类

1️⃣从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。

2️⃣从应用层次来分:普通索引,唯一索引,复合索引

3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

1️⃣中所描述的是索引存储时保存的形式,

2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:即一个索引包含多个列

聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(认真脸)。

二、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

不谈存储引擎,只讨论实现(抽象)

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

id name birthday
1 Tom 1996-01-01
2 Jann 1996-01-04
3 Ray 1996-01-08
4 Michael 1996-01-10
5 Jack 1996-01-13
6 Steven 1996-01-23
7 Lily 1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

在InnoDB中的实现

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

三、问题

问:为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?

hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。

问:为什么官方建议使用自增长主键作为索引。

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

插入连续的数据:

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

插入非连续的数据

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

图解MySQL索引--B-Tree(B+Tree)「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111775.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • mybatis缓存配置

    mybatis缓存配置mybatis的缓存有三种方式:1、一级缓存(基于SqlSession会话级别的;2、二级缓存(基于nameSpace级别的,范围比以及缓存更广);3、第三方缓存;mybatis缓存使示意图:一、一级缓存说明:其中一级缓存是mybatis默认使用的缓存,无需手动配置,二级缓存需要手动配置;一级缓存失效条件1)sqlSession不同,由于一级缓存是基于sqlSession级别的,所以当使用不同sq…

    2022年5月21日
  • ModelMapper:po到vo的映射

    ModelMapper:po到vo的映射

    2021年9月1日
  • 光场相机可以计算光线的方向,也可以计算目标的深度_相机感光器在哪里

    光场相机可以计算光线的方向,也可以计算目标的深度_相机感光器在哪里博主最近在搞光场相机方面的研究啦,好了废话不多说,开始!1.一些前言废话首先,来一下光场的基本概念,来自百度百科。光场(lightfield):就是指光在每一个方向通过每一个点的光量。从概念里

    2022年8月3日
  • 项目管理第五章项目范围管理内容_项目范围管理在规划过程组四个模块

    项目管理第五章项目范围管理内容_项目范围管理在规划过程组四个模块项目管理第五章项目范围管理项目范围管理:范围管理确保项目做且只做所需的工作,项目范围管理过程包括:规划范围管理:为记录如何定义、确认和控制项目范围及产品范围,而创建范围管理计划的过程。收集需求:为实现项目目标而确定、记录并管理相关方的需要和需求的过程。定义范围:制定项目和产品详细描述的过程。创建WBS:将可交付成果和工作分解为较小、易于管理的组建过程。确认范围:正式验收已完成的项目可交付成果的过程。控制范围:监督项目和产品的范围状态管理范围基准变更的过程。范围管理的核心理念:

    2022年9月22日
  • 微信后台服务器能查撤回的消息吗,微信撤回的消息还能看到吗?查看方法介绍…「建议收藏」

    微信后台服务器能查撤回的消息吗,微信撤回的消息还能看到吗?查看方法介绍…「建议收藏」如果大家在使用钉钉办公软件的话,应该知道钉钉密聊功能,使用这个功能之后聊天的内容会自动销毁,而且不能进行复原操作的。所以很多用户都在问微信撤回的消息还能看到吗,是不是和钉钉密聊一样不能进行恢复了,接下来小编就为大家进行详细介绍,以及对微信撤回的消息查看方法进行介绍。微信撤回的消息按照原理或者是字面上的意思来说用户是看不到这类消息了,除非大家在对方未操作消息撤回之前已经进行了消息的查看,如果没有进行…

    2022年6月16日
  • web移动端:touchmove实现局部滚动

    总结一下最近项目用到的一个功能点,具体要求如下:body中会呈现一个可滚动的长页面,在点击某个按钮的时候,会出现一个弹出框,由于弹出框的内容较长,会出现滚动条,但是要保证位于弹框下部的body在弹框滚动的时候不触发滚动事件实现效果图如下:一.css部分html,body{margin:0;padding:0;}.btn{position:fixed;

    2022年4月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号