MySQL索引原理

在这里插入图片描述


MySQL索引原理

  • 1、Innodb中的B+树是怎么产生的呢? 背景
    • 1.1、mysql索引使用B+树,为什么?
    • 1.2、主键索引图示
    • 1.3、mysql最好使用自增ID:为什么呢?
    • 1.4、高度为3的B+树能存多少条数据?
      • a、假设2层
      • b、假设3层
  • 2、索引采用什么数据结构?
  • 3、为什么不用哈希表进行数据存储
  • 4、B+ 树特点
  • 5、回表、索引覆盖、最左匹配的区别
  • 6、内存与磁盘交互问题

1、Innodb中的B+树是怎么产生的呢? 背景

类似链表存储

mysql数据存在磁盘还是内存?磁盘
mysql的索引数据存储在那?磁盘
存在内存,一旦断电,索引需要重新重建

1.1、mysql索引使用B+树,为什么?

mysql的数据存储在磁盘,mysql的索引数据也存在磁盘——》这里就涉及到了磁盘的交互过程——》通过IO交互:为了减少资源消耗:减少io量,减少io次数

当数据量非常大的时候,没办法一次加载到内存中——》采用分块读取——》分而治之——》磁盘预读,在内存和磁盘之间交互有一个最基本的的逻辑单位,称为页,也叫做datapage,datapage的大小跟操作系统相关,一般是4kb或者8kb,我们在进行数据读取的时候一般选择页的整数倍进行读取。

innodb存储引擎每次读取16kb
在这里插入图片描述

1.2、主键索引图示

一页有16kb,每一页包含页目录、用户数据区域、指针。
在这里插入图片描述

1.3、mysql最好使用自增ID:为什么呢?

当使用索引列进行数据查询的时候,最终会到主键索引树中查询对应的数据行进行返回。

mysql中一页有16kb的数据,假设我插入了4条数据,一页占满了;
当我插入第5条数据,如果一页满了会新增一页,
但是会出现新插入的数据加入到那一页?

如果不是自增列的话,会修改之前已经满的页,影响性能。
在这里插入图片描述
指针指向
在这里插入图片描述
当第2页中的数据满了会新增第3页…,依次类推
在这里插入图片描述
当插入a=60000时,在磁盘中,会从第一页开始遍历链表,速度太慢了。怎么优化?

在这些页的上层增加1页,只存储组件和指针,其中int类型占4个字节 + 指针占6个字节 = 10个字节。

整页16kb/10字节=(1638页)存多少页

当a=60000的时候,可以从第一层的数据获得具体的索引范围,接着向下取数据。
效率立刻提升。

类似于下方的图示
在这里插入图片描述

1.4、高度为3的B+树能存多少条数据?

a、假设2层

假设:数据表中每一条记录为1kb,
一页里面能存多少条记录:16kb/1kb
一共1638页,
存1638*(16kb/1kb)= 26208

b、假设3层

一般情况下,3层的B+树足以支撑千万级别的数据量存储。

2、索引采用什么数据结构?

数据结构——》哈希表、一堆树——》B+树

3、为什么不用哈希表进行数据存储

1、哈希冲突和哈希碰撞问题,当哈希算法有问题的时候会造成大量的哈希碰撞问题,导致数据聚集。
2、哈希表是散列表,数据是无序的,当需要进行范围查询的时候只能挨个对比,效率比较低。

memory存储引擎使用的是哈希索引
innodb存储引支持自适应哈希
在这里插入图片描述

4、B+ 树特点

B+Tree是在BTree的基础之上做的一种优化,变化如下:
1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,

  • 第一个原因是为了降低树的高度。
  • 第二个原因是将数据范围变为多个区间,区间越多,数据检索越快。

2、非叶子节点存储key,叶子节点存储key和数据。
3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高。

在这里插入图片描述

5、回表、索引覆盖、最左匹配的区别

例如:
select * from 表名 where time=“zhangsan”——》回表
select id,name from 表名 where time=“zhangsan”——》索引覆盖
在这里插入图片描述

6、内存与磁盘交互问题

update数据时:
1、判断更新的数据是否在内存中,如果在内存中直接更新数据
2、如果不在内存中,需要把磁盘的数据加载到内存中
3、去修改内存的数据
4、再把内存中的数据溢写到磁盘中。

内存往磁盘写的过程中可能出现没写完就断掉了,导致数据丢失。

随机读写:
磁盘寻址找到数据需要消耗时间

在这里插入图片描述
顺序读写:
append,写入日志redlog
在这里插入图片描述
举例:
餐馆,记账本——》找到个人账单——》加上10元
餐馆,小黑本——》记录消费的金额——》不忙的的时候再把信息挪到记账本中。

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

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

相关文章

从0到1构建uniapp应用-store状态管理

背景 在 UniApp的开发中,状态管理的目标是确保应用数据的一致性,提升用户体验,并简化开发者的工作流程。通过合理的状态管理,可以有效地处理用户交互、数据同步和界面更新等问题。 此文主要用store来管理用户的登陆信息。 重要…

python--面向对象编程和类的定义,对象的创建

一、面向对象简介 1、什么是面向对象 面向对象是一种编程思想,把数据和对数据的多个操作方法封装在一起组成类,这样通过这个类创建出来的对象,就可以直接调用这些方法了。 2、面向对象相关的术语 类:用来描述具有相同的属性和方法的对象的…

基于深度学习的花卉检测与识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:在本篇博客中,我们深入探讨了基于YOLOv8/v7/v6/v5的花卉检测与识别系统。核心上,我们采用了最新的YOLOv8技术,并整合了YOLOv7、YOLOv6、YOLOv5等先进算法,进行了细致的性能指标对比分析。我们详细介绍了当前国内外…

刚刚,Sora官方发布首支MV

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 AIGC,算是狠狠地震荡了一把音乐圈。 就在刚刚,OpenAI官方账号发布的一支由Sor…

哲♂学家带你用顺序表实现通讯录

实现通讯录能使我们进一步加深对顺序表的理解,接下来就由本哲♂学家带你手把手实现通信录。 其中需要用到顺序表的知识可以点击下面链接了解:http://t.csdnimg.cn/9SjGd话不多说,我们♂开始吧。 一、通讯录头文件声明 由于我们前面已经写过…

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题: 蓝桥杯竞赛特别喜欢考日期问题,今天给大家分享一下…

JS——判断节假日(假日包括周末,不包括调休上班的周末)

思路:创建两个数组,数组1为节假日数组,数组2为是周末上班日期数组。如果当前日期(或某日期)同时满足2个条件(1.在节假日数组内或在周末。2.不在周末上班日期数组)即为节假日,否则即为…

即将截稿 CCF-A多媒体顶会ACM MM‘24 北京时间4月9日提交摘要

会议之眼 快讯 第32届ACM MM (ACM MULTIMEDIA)即国际多媒体会议将于 2024 年 10月28 -日11月1日在澳大利亚墨尔本隆重举行!MM是由ACM(Association for Computing Machinery,计算机协会)主办的国际性学术会议,是计算机…

【Java EE】Maven jar 包下载失败问题的解决方法

文章目录 1. 配置好国内的Maven源1.1配置当前项⽬setting1.2设置新项⽬的setting 2.重新下载jar包3.其他问题⭕总结 1. 配置好国内的Maven源 因为中央仓库在国外, 所以下载起来会⽐较慢, 所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍, 如何设置国内源 1.1配…

分享一款实用的太阳能充电电路(室内光照可用)

随着物联网的发展,很多智能电子设备都朝着低功耗方向发展,光能,风能,机械能等不同的自然能源都能被利用起来作为电子设备的能量来源,本文要分享一款太阳能充电电路。 前言 大家好,我又来分享电路了&#…

redis的常用基本命令与持久化

文章目录 redis的基本命令1.授权密码2.增加、覆盖、查询、删除、切换库名、移动、清空数据库 Redis持久化RDB模式主动备份自动备份RDB备份过程 AOF备份模式开启AOF备份模式执行流程 总结 redis的基本命令 1.授权密码 config set requirepass 密码设置完密码需要认证密码以后才…

OpenAI劲敌出手!Claude 3正式发布,全面超越GPT-4。Claude3模型特点和使用教程分享

已有GPT官方账号不会升级GPT4请参考:【国内如何用gpt4?如何升级gpt4?保姆级教程】 一、Claude震撼发布焦点分析 1.Claude震撼发布 北京时间2024年3月4日晚间,Anthropic,毫无预警地发布了最新一代大模型Claude 3&…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的! 如果有现成的最好,没有办法的情况下再用这个东西。 今天公司有一个项目,地方划分了一块区域,但是国家没有审核,但是项目里面用到了一个地图展示数据!然后就需要我们自己把…

【深度学习】深度学习md笔记总结第3篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程(附代码资料)主要内容讲述:深度学习课程,深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍,2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

Java 包装类初识泛型

登神长阶 第六阶 包装类&初识泛型 目录 😀一.包装类 😄1.基本数据类型以及其对应的包装类 😂2.装箱和拆箱 😇2.1.装箱(Boxing) 😉2.2.拆箱(Unboxing) &#x…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法:将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突:不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突: 1. 开放寻址:产生哈希冲突后&…

C语言程序与设计——指针地址与main函数

指针变量 在C语言中,最重要的就是对于指针和地址的理解,因为C语言是更接近底层的编程语言,所以它可以允许开发者对内存操作,这也是区别于其它编程语言的一个重要特性。 如何对内存进行操作呢。我们知道在编程过程中,在…

续二叉搜索树递归玩法

文章目录 一、插入递归二、寻找递归&#xff08;非常简单&#xff0c;走流程就行&#xff09;三、插入递归&#xff08;理解起来比较麻烦&#xff09; 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

瑞_Redis_商户查询缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 2.2 添加Redis缓存2.2.1 背景2.2.2 缓存模型和思路2.2.3 代码实现2.2.4 测试附&#xff1a;IDEA控制台输出自动换行设…