mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我

听说微信搜索《Java鱼仔》会变更强哦!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦

(一)关于索引

索引是帮助Mysql更加高效获取数据的一种数据结构,索引的使用很简单,但是如果不能理解索引底层的数据结构的话,就谈不上去优化索引了。

(二)B+树

Mysql的索引用的是B+树,他具有这样的几个特点:

1、数据都存储在叶子节点中、非叶子节点只存储索引

2、叶子节点中包含所有的索引

3、每个小节点的范围都在大节点之间

4、叶子节点用指针相连,提高访问性能,比如条件是>或者<的查询就可以直接按指针找(Mysql中的B+树叶子节点中的指针是双向指针)

75268e5b7dbc6c19a200d6a653f56269.png

B+树的数据结构如图所示,首先非叶子节点只存储索引,且每个指针所指向的节点最左边的索引都是该指针对应的索引值,比如头节点的第一个索引值8,指向的非叶子节点的第一个索引值也是8。

(三)为什么索引这么快?

索引可以支撑千万级表的快速查找,为什么呢?下面就来解释一下:

show GLOBAL STATUS like 'Innodb_page_size'

bdd1f75d4a19b984a658e3eab5ea87aa.png

在Innodb中,默认的innodb_page_size大小为16kb,这就相当于上面每一个节点的大小默认情况下是16kb。一个索引值的大小为8B,索引后的指针所占大小为4B,因此可以解算出一个节点中大约可以存储1170个索引。

对于叶子节点,由于存储了数据,我们可以大方地估计每个数据的大小为1kb,相当于在叶子节点中每个节点可以存储16个数据。

这样就可以计算出一个三层的B+树结构的索引一共可以存储1170117016=2190万条数据,这就意味着只需要三次磁盘IO,就可以检索两千万条数据,由此可见索引可以支撑千万级表的快速查找。

b7eaeb66ea3167f09997360f3ce28da6.png

(四)Innodb索引的实现

Mysql中的存储引擎有Innodb和Myisam两种,两种索引的实现底层虽然都是B+树,但是实现形式还是略有不同。

Innodb属于聚簇索引,即叶子节点包含了完整的数据记录。下面这张图是innodb的主键索引,所有的数据都放在叶子节点中。

2465977e63867e003c36a82707ae8d54.png

Innodb要求表必须有主键,并且推荐使用整型的自增主键,这也和他索引的实现有关,使用整型可以更好的进行B+树的排序,同时采用自增的方式可以在插入数据时将数据插入到最后一个节点的后一个,而不用对已产生的索引拆分。

非主键索引和主键索引略有不通,非主键索引的叶子节点存储的是主键的key值:

b6042a97e5afa2cf1ae7b09808815894.png

采用这种方式保持了数据的一致性,当新增一条数据时,只需要在主键索引处修改数据即可,而不会出现每个索引各自维护的情况。第二个优势是节省了存储的空间,数据只需要保存一份即可。

(五)MyIsam索引的实现

Myisam索引文件和数据文件是分离的,在MyIsam存储引擎中,新建一张表后会在磁盘中增加三个文件:

c35212bb87d526ef3ac7c2c46c8df4d0.png

.frm 文件存储的是表结构,.MYI文件存储的是B+树的索引表,MYD存储的是数据,我通过下面这张表展示MyIsam索引:

8dff9bfae4b9193c143e2348a4edfa0b.png

(六)总结

关于数据库的索引,绝对是工作中常用,面试常考的问题,他太重要了。理解索引底层数据结构更加重要,这是后续优化的基础,好了,我们下期再见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的字符函数与字符串函数介绍(1)

常见的字符函数与字符串函数介绍 前言 C语言中对字符与字符串的处理很是频繁,但是C语言中并没有字符串类型的变量,字符串通常存放在常量字符串或者字符数组中。字符串常量适用于那些对它不做任何修改的字符串函数。 函数功能简介与再实现 1、 strlen…

postman raw带文件_postman raw模拟各种http post请求

在url或者query里面传递参数这个最简单http://localhost:5000/queryhttp://localhost:5000/query/xxxhttp://localhost:5000/query/idxxx上传表单key-value数据1.使用自带的功能body设置header设置2.使用raw来模拟body设置header设置不变上传单个文件1.使用自带功能body设置hea…

找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符

题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是g。当从该字符流中读出前六个字"google"时,第一个只出现一次的字符是l…

win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...

如今,大部分用户下载到的win10系统都是属于镜像文件,能够最大便利的让用户安装步骤简单化,可是最近有用户下载的win10系统中出现了镜像不能安装的问题,那么win10镜像不能安装系统如何解决呢?下面就来告诉大家win10镜像…

anaconda下载jupyter写python_如何安装Anaconda3和使用Jupyter

如何安装Anaconda3和使用Jupyter发布时间:2020-10-28 14:41:26来源:亿速云阅读:64作者:Leah这期内容当中小编将会给大家带来有关如何安装Anaconda3和使用Jupyter,文章内容丰富且以专业的角度为大家分析和叙述&#xff…

mysql 42642 安装报错_1/5 MySQL入门总结:下载安装

MySQL.msi版本下载:www.mysql.com >DOWNLOADS >Windows >MySQL Installer >mysql-installer-community-8.0.13.0.msi(不建议下载解压缩版,因为它还要配置my.ini文件,亲身实践,麻烦)安装:o. 缺失“Microsof…

java 3位小数_数字有效小数第三位四舍五入

[java]代码库import javax.swing.JOptionPane;public class Test{public static void main(String[] args){String sJOptionPane.showInputDialog("请输入数字:");double aDouble.parseDouble(s);//转换成数字double ba;//临时存储int p0;//用于计算小数从…

java实现文件合并_Java实现文件分割和文件合并实例

文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客,本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上了。当然我会尽力好好写注释的。文件切割器:import java.io.File;import java.io.FileNotFoundException;import java…

java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

万千封印我知道编译器需要在编译时知道表达式才能编译一个开关,但是为什么foo.ba_常数不是呢?虽然从字段初始化后执行的任何代码的角度来看,它们都是常量,但它们不是编译时间常数在JLS所要求的意义上;见15.28常量表达式…

java web 开发技术大全 代码_Java Web开发技术大全

资深程序员全力打造,深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识、高级技术及应用案例 内容全面,讲解详细,全面覆盖JSP、Se rvlet、AJAX及SSH框架整合开发 避免冗长的理论讲解,而是直击主题,通过…

java nio doug_深入的聊聊 Java NIO

趁着三天假期,把Java NIO和Reactor模式整理总结了下,文章特别细节的知识点没有写,如一些API的具体实现。类似数据读到Buffer后再写出时,为什么需要复位操作,这些都属于NIO基础知识,是学习Reactor模式的前置…

java clone原理_详解Java中的clone方法 -- 原型模式

Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有…

portal认证 java_华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题

各位:您好,我通过一台华为5700交换机和一台portal服务器,想利用交换机本地的aaa认证,完成用户的上网认证。配置好后,用户可以重地向到portal页面,但是认证不能通过,具体配置如下:一、…

java复制一个对象_Java中对象的复制

假如说你想复制一个简单变量。很简单:1 int n 5;2 int m n;不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。但是如果你复制的是一个对象,情况就有些复杂了。假设说我是一个beginner&#xff0c…

HA集群实现原理 切换 JAVA_HA(一)高可用集群原理

高可用集群原理LVS集群DR模式简单的架构图如下所示:在上图的架构中,当Director服务器因软件、硬件、人为原因造成故障时,整个集群服务不可用,因此,需要再添加一台服务器实现Director服务高可用。整个系统的架构图如下所…

c语言指针没学可以学java_这是一篇来自刚脱离C语言的菜鸟所写下来的关于C语言之后转JAVA入门前期学习的感想...

/***My First writing*Name Li Tai Yue*Date 2018.12.14*/这是一篇来自刚脱离C语言的菜鸟所写下来的关于C语言之后转JAVA入门前期学习的感想。并且我也觉得这是一篇所有在校学习程序的小伙伴值得一看的文章。我想很多小伙帮都觉得敲代码是一件非常枯燥的事情,每天敲…

java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810

题目要求:给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21示例 4:输入:9646324351输出: 0注意:假设我们的环境只能存储得下 3…

java se 开发web程序_JDiy快速开发WEB之javaSE环境搭建-初级

大学的时候对web开发很感兴趣,对网页中的动画,对用户注册,对网页中表格填写等等都倍感兴趣。加之又有专业课程编程语言java,因此,对java web产生了浓厚的兴趣,再加之有北京圣思园 风中叶 大师的视频教程&am…

java apktoo_apktool.jar

apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包,给大家提供最新的apktool.jar2.3.4,有需要的赶快下载吧!。相关软件软件大小版本说明下载地址apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包,给大家提供最新的ap…

Java 内存 关系_JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系在一些具有8g物理内存的服务器上,主要运行Java服务。系统内存分配如下:Java服务的JVM堆大小设置为6g,监视过程大约需要600m,Linux本身使用大约800m。从表面上看,物理记忆应该足够&#xf…