Mysql-索引-数据结构

Mysql索引-B树/B+树

tip 索引好处初体验:

select count(*) from ydl_user;  -- 5.429
select * from ydl_user where user_id = 1000000; -- 0.355s
select * from ydl_user where user_name = 'Jennifer Susan Johnson';   -- 4.715s

一方面mysql的数据是存储在磁盘上的,另一方面还要满足对日常操作如【增删改查】的高效稳定的支持,我们当然可以采用更好的硬件来提升性能,但是选用合适的数据结构也很关键,innodb采用的是一种名为【b+树】的数据结构。

我们之前已经学习过innodb中的数据是以【行】为单位,存在一个个大小为16k的【页】中,刚才的b+树的作用就是按照一个的组织形式,将所有的【页】组织关联起来。

1、B-树

我们要了解【B+树】,首先要了解一下【B-树】,这里的 B 表示 balance( 平衡的意思),B-树是一种【多路自平衡的搜索树】,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.

在这里插入图片描述

B-树有如下特点:

  1. 所有键值分布在整颗树中;
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束;
  4. 在关键字全集内做一次查找,性能逼近二分查找;

2、B+树

【B+树】是【B-树】的变体,也是一种多路搜索树。

【B+树】是【B-树】的不同之处在于:

  1. 所有关键字存储在叶子节点
  2. 为所有叶子结点增加了一个双向指针

简化 B+树 如下图:

在这里插入图片描述

3、选型缘由

问题一:为什么在b-树或b+树中选择?

  • mysql数据模型更适合用这类数据结构,一条数据中通常包含【id】+【其他列数据】,我们可以很轻松的根据id组织一颗B+树。
  • 我们知道innodb使用【页】(这是inndb管理数据的最小单位)保存数据,一页(16k),b+树中的每个节点都是一页数据。

问题二:为什么选择B+树?

  • 相同的空间,不存放【整行数据】就能存【更多的id】,b+树能使每个节点能检索的【范围更大、更精确,极大的减少了I/O操作,保证b+树的层高较低,通常3到4层的层高就能支持百万级别的访问】。
  • Mysql是一种关系型数据库,【区间访问】是很常见的一种情况,B+树叶节点增加的双向指针,加强了区间访问性,可使用在范围区间查询的情况。

4、发现索引

我们发现当使用id去查询数据时,效率很高,因为使用id可以利用B+树的特性,加速查询,请看以下两条sql的执行效率:

select * from ydl_user where id = 1                              -- 使用时间0.011s
select * from ydl_user where email = 'm.szi@xwsrnhp.pl'          -- 使用时间4.284s

我们发现,查询相同的记录,使用【id列】比使用【emil列】快了389倍,原因如下:

  • 使用id列可以利用B+树的特性,由上自下查询。
  • 使用email列只能从叶子节点进行【全表扫描】,一个一个的比较。

那么如果我想提升使用其他字段的查询效率,应该怎么做呢?

首先,我们应该想到的思路就是,按照这个逻辑再给其他的字段也创建一个这样的结构不就好了,如下:

在这里插入图片描述

但是我们会发现,如果我们不断的创建类似的结构,数据会保存很多次,1个G的数据可以膨胀为5G甚至10G,所以我们可以进行优化,在叶子节点中只【保存id】而不保存全部数据,查到id后再【回表】(回到原来的结构中根据id进行查询)查询整条记录,其结构如下:

在这里插入图片描述
其实这就是我们日常工作中经常创建的【索引】。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/4377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaEE简单示例——基于注解的事务管理

简单介绍: 在之前,我们介绍了基于XML配置文件的配置方式,这种方式对于程序员来说还是比较繁琐了,我们这次来介绍一个更简单的方式来配置事务管理,那就是基于注解的事务管理。 接下来我们来开始介绍基于注解的事务管理…

轻松拿下年薪35W+Offer!这15个高频开发面试问题必须掌握!

作为SaaS行业的先驱,Salesforce的发展一路高歌猛进。Salesforce开发人员不仅能学习到最新的技术,而且比其他行业的同岗位享有更高的薪水,这也驱使了越来越多人加入Salesforce大军。 通过自由侠部落目前发布的岗位机会来看,即使在二…

企业邮箱的定义和要求

在讨论哪个企业邮箱最好使用之前,我们先明确一下企业邮箱的定义和要求? 以下是安全性、管理权限、员工体验、服务品质四个方面的总结,希望对您的选择有所帮助: 1.安全性 安全第一,这是不变的真理!当企业使…

vue-antd-admin——实现全网站选项的切换并实现页面的刷新——技能提升

今天写后台管理系统时,遇到一个需求,是关于内外贸选项的切换。 效果图如下: 默认是内贸选项,当进行切换时,无论是在哪个页面,当前页面都要进行刷新,并将选项的参数传递到接口中。 下面详细介…

iOS私有pod库的gitignore文件

我们在进行pod 死有库开发的时候,如果使用默认生成的gitignore 文件,每次提交和拉代码都会有大量的冲突,会严重干扰我们正常的开发,所以有必要进行设置一些忽略文件 通常pods 文件夹中的文件是要忽略的,还会有podfile…

聊一聊前端的性能指标

一、前端性能指标有哪些? 根据 chrome Lighthouse 最新规则,前端性能指标考量主要有 FCP(First Contenful Paint)、SI(Speed Index)、LCP(Largest Contentful Paint)、TBT&#xff…

CSS transition 小技巧!如何保留 hover 的状态

前言 通常情况下,hover 是无法保存状态的。鼠标移入触发额外样式,一旦移出就还原了 el:hover{color: red }这就意味着,如果需要保留 hover 的状态,可能就不得不借助 JS 了,比如下面是某某书院的首页排行榜效果。 这…

图解redis的AOF持久化

目录 1.引言 2.AOF持久化的实现 2.1命令追加 2.2AOF文件的写入 3.AOF的文件载入和数据还原 4.AOF重写 4.1AOF重写实现 4.2AOF后台重写(BGREWRITEAOF) 1.引言 redis是一个内存数据库,如果需要保存在磁盘那么就是需要持久化&#xff08…

thinkphp+vue水果购物商城网站

需要解决的主要问题: 1、网页编程环境和工具。 2、后台数据库的管理。 3、网站的基本功能建设。 4、对比实际应用中的购物网站的功能和运作流程,完善程序功能。 水果购物商城系统的主要使用者分为管理员;个人中心、用户管理、水果分类管理…

二维前缀和求子矩阵

二维前缀和求子矩阵 如何计算前缀和矩阵: - 如何利用前缀和矩阵,计算某一个子矩阵的和: 如求:[x1y1,x2,y2]子矩阵的和,Sx2,y2-Sx2,y-1-Sx1-1,y2Sx1-1,y1-1 例题及代码模板: 子矩阵的和 输入一个n行m列的…

VSQT 联编无转到槽选项--VS2019中使用QT建立信号和槽函数连接

问题 如题所述 解决方法 自己动手丰衣足食 //xxx.h signals:xxx private slots:xxx //xxx.cpp半自动化 用惯了转到槽函数肯定对此难以适应,觉得特别麻烦。其实我们有相对简洁的方法。 仅需要规范命名即可! 例如,我需要添加一个 pushButton…

Pytorch线性模型实现——up主:刘二大人《PyTorch深度学习实践》

教程: https://www.bilibili.com/video/BV1Y7411d7Ys?p2&vd_source715b347a0d6cb8aa3822e5a102f366fe 数据集: xdata[1.0,2.0,3.0]ydata[2.0,4.0,6.0]x_{data} [1.0, 2.0, 3.0] \\y_{data} [2.0, 4.0, 6.0]xdata​[1.0,2.0,3.0]ydata​[2.0,4.0,6…

Spring —— Spring简单的读取和存储对象Ⅰ

JavaEE传送门JavaEE Spring —— 初学 Spring, 理解控制反转 Spring —— Spring 的创建与使用 目录Spring 简单的读取和存储对象存储 Bean 对象配置扫描路径添加注解存储 Bean 对象Controller (控制器存储)Service(服务存储)Repository(仓…

Python中 join() 函数的使用方法

人生苦短,我用python 函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join():连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 os.path.joi…

vue+springboot贫困山区儿童衣物捐赠网站系统

旧衣物捐赠系统从功能、数据流程、可行性、运行环境等方面进行需求分析。对旧衣物捐赠系统的数据库、功能进行了详细设计。分析了主要界面设计和相关组件设计,对旧衣物捐赠系统的具体实现进行了介绍。 采用Java技术,从数据库中获取数据、向数据库中写入数…

Studio One没有声音怎么办 Studio One工程没有声音

Studio One是一款非常优秀编曲软件,能够帮助用户高效的进行编曲和创作,也是目前主流的通道机架软件之一,受到很多音乐编曲爱好者的追捧。但是很多刚接触这款软件的小伙伴会碰到这样或者那样的问题,比如Stuidio one没有声音怎么办&…

Go底层原理:一起来唠唠GMP调度(一)

目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G…

IO的类型(BIO、NIO、AIO)

概览首先,我们需要明白什么是IO?IO从字面意思可以理解为输入输出,对于Java进程来讲,输入就是将数据输入到Java内存的缓存区,供Java读取使用,输出就是Java进程将数据写入到缓存区,进而输出到文件…

GameFramework框架详解之 Config全局配置

前言 GameFramework是一个模块封装非常完整的游戏框架,其中有一个全局配置表,存储了一些游戏中使用的全局常量。 全局配置表的结构和DataTable结构很相似,只不过少了id一列,因为全局配置不使用Id进行查询,而是使用key值进行查询。 全局配置逻辑比较简单,下面我们来通过…

Nacos配置中心优雅配置JSON数据格式

在我业务开发中,需要在配置中心配置Json数据,返回给前端。因Nacos默认不支持Json格式配置,需要搭配监听器获取配置中心Json数据,返回给客户端。二、搭配Nacos配置Josn数据1. bootstrap.ymlserver:port: 9000 spring:application:n…
最新文章