当前位置: 首页 > news >正文

InnoDB存储引擎(1)

InnoDB存储引擎的优点

InnoDB在设计时考虑到了处理大数据量时的性能,支持事务,回滚和崩溃修复的能力,通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束;通过缓冲池在内存中缓存数据来提高查询的性能;可以每个表使用各自的独立表空间存储数据并且文件大小只受限于操作系统.

总结:InnoDB存储引擎存储的数据量大,性能高,可以有效的保证数据安全。

InnoDB的架构

InnoDB主要包括内存结构和磁盘结构。

内存结构

  • 缓冲池:内存中的主要工作区域,优化查询的性能。
  • 变更缓冲区:优化修改操作的性能。
  • 日志缓冲区
  • 自适应哈希索引:当某一查询语句的执行次数达到mysql设定的阈值时,mysql会将查询语句和对应的结果集映射起来,从而进一步提升查询的性能。

磁盘结构

系统表空间,独立表空间,通用表空间,临时表空间,撤销表空间,保存的都是真实的数据。

重做日志,双写缓冲区。

为什么要设计成内存结构和磁盘两部分

数据库的作用就是保存数据,用户的真实数据最终都会保存在磁盘当中,但是磁盘的IO速度慢,为了提高访问数据的效率,InnoDB会将查询到的数据缓存到内中,当再次查询时,如果目标数据已经存在于内存中,则直接在内存中读取。

磁盘结构中的文件用来保存数据实现数据持久化;内存结构用来缓存数据提升查询效率。

使用InnoDB存储引擎创建的表对应的数据文件在哪里

当创建一个数据库时,会在数据目录生成一个与数据库同名的子目录。

当创建一个表时,默认会在对应的数据库子目录中生成相应的表空间文件,以表名为文件名,以ibd为文件后缀,用来存储数据和索引。

如果每个表都对应一个表空间文件,则称为独立表空间,在5.7版本之后,默认会为每个表生成独立表空间,可以通过innndb_file_per_table = [on|off] 来进行控制,如果为off,则会将所有的表的数据都存储在系统表空间中。

Mysql的存储结构

Mysql的存储结构是指MySQL为了有效的维护数据而定义的一系列的数据结构。

用户数据在表空间中如何存储?

用户的数据以数据行的方式存储在对应的表空间文件中,为了方便管理,表空间由段,区组,区,页和数据行组成。

若干个数据行组成了页,多个页组成了区,多个区组成了区组,多个区组组成了段,多个段组成表空间。

页是InnoDB磁盘管理的最小单位,内存每次至少读取一个页。

为什么要用页这个数据管理单元?

页是mysql应用层的概念,是mysql根据自身的应用场景而定义的一种数据结构。

页的大小默认为16KB(4个数据块的大小),作为磁盘管理的最小单位。

每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的。

即使只需要查询一条数据,但是从磁盘上读取了16kb,根据空间局部性原理,也不会造成资源的浪费。

所以,使用页最主要的目的是为了减少磁盘IO,提高性能。

数据页的基本特性

页的默认大小是16KB,可以适用于大多数场景,也可以根据核心表中数据行的大小来调整数据页的大小,调整的大小必须是4kb数据块的整数倍。

每一个页中,即使没有数据也会使用16kb的存储空间,同时与索引的B+树中的节点对应。

MySQL中有多种不同类型的页,但不论哪种类型都会包含页头和页尾,页头和页尾之间的页主体信息根据不同的类型有不同的结构。

查询的数据超过一页的大小,怎么提高查询效率?

拆分成三个问题:

不同的页在磁盘中是不是连续的?

不一定,在不做任何控制的情况下,不同页在磁盘中申请的地址大概率是不同的。

为什么不连续的地址会降低查询的效率?

访问不连续的地址会产生磁盘的随机访问,这是影响效率的主要因素。

扇区是磁盘中存储数据的最小单位,每个扇区大小固定为512B,如果读取某个扇区的数据,分为两步:1.先转动机械臂杆。让磁头找打对应的磁道。2.通过转轴带动盘面的转动找到对应的扇区。

InnoDB如何保证页在磁盘中的连续性?

为了解决磁盘随机访问低效的问题,需要尽可能在磁道上读取连续的数据,来减少磁头的移动,所以MySQL使用区来管理页,每个区(默认是连续的1MB的空间)存放固定数量的页,如果需要跨页读数据,那么大概率就在附近的地址,大幅减少磁头的移动。

综上,跨页查询的三种情况:

  1. 页在区内是相邻的:磁盘顺序IO,大幅提升效率。
  2. 页在区内,但不相邻:大幅减少磁头的移动,可以提升效率。
  3. 页在不同的区:随机IO,不能提升效率。

区和页的关系:区是用来管理页的一种数据结构,其中包含若干个页,从而保证页与页之间的连续性。

当表中的数据很少时如何避免空间的浪费?

通过碎片页和零散区避免空间的浪费。

当创建表时,由于不知道表的数据量级,为了节省空间,最初只会创建7个初始页,而不是一个完整的区。

零散页会放在表空间的碎片区,随着数据量的增加,会申请新的页来存储数据,当碎片去的页超过32个时,才会申请完整的区来存储更多的数据。

如果访问的数据跨区了怎么办?

使用区组结构有效的管理区,每个区组固定管理256个区(256MB),区组条目信息中会记录每个区的偏移量并用双向链表连接。

区组管理区不会像区管理页那样,实现页在物理地址的连续性,一下子申请256MB太大了,所以不同的区在磁盘上大概率是不连续的。

逻辑结构-段

段是一个逻辑概念,作用是管理不同的区和碎片区中的页。

段主要分为叶子节点段和非叶子节点段,对应索引中的叶子,非叶子节点。

相关文章:

InnoDB存储引擎(1)

InnoDB存储引擎的优点 InnoDB在设计时考虑到了处理大数据量时的性能,支持事务,回滚和崩溃修复的能力,通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束;通过缓冲池在内存中缓存数据来提高查询的性能&#xff…...

VMWare虚拟机共享主机的网络访问外网

1.主机中启动客户端并连接外网 2.设置虚拟网络类型为NAT 3.启动虚拟并通过主机访问外网...

LeetCode Easy|【415. 字符串相加】

力扣题目链接 题目本身难度不大,但是后续的一些补充内容还是值得搞清楚的 主要的逻辑如下: 其实本题的目的就是让我们来模拟我们的竖式加法。所以很直观的一个想法就是使用双指针:分别指向两个 num 的末尾。随后就会产生一些问题&#xff1a…...

RAG 革命:NVIDIA 工作站如何成为企业 AI 的秘密武器

在深圳的一家科技初创公司,首席技术官李梅正在向她的团队展示一个令人兴奋的新项目。“看这个,” 她指着屏幕上的实时演示说,“我们刚刚用公司的技术文档训练了一个 AI 助手,它现在可以回答任何关于我们产品的问题,而且…...

九大原则,轻松构建个人高效SOP

1、原则一、工作汇报SOP SCQA模型(升职加薪的关键!) 清晰定义问题和提出解决方案 类别 关键词 解读 S - Situation 情景 陈述项目背景,目标,愿景 C - Complication 冲突 讲卡点,讲冲突 Q - Question 疑问-问题 这些冲…...

Airtest的demo实现多设备并行

Airtest的demo实现多设备并行 它实现是的获取adb连接上的所有设备,然后在每一台设备上跑给定的测试用例,跑完之后生成单机的测试报告,最后再汇总这些单机测试报告的结果,形成汇总(聚合)报告: 同…...

社区养老服务小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,服务人员管理,服务产品管理,服务预约管理,服务状态管理,服务退订管理,活动管理,视频管理 微信端账号功能包…...

Interceptor拦截器开发

因为1登录后的接口都需要token验证代码,会出现重复代码;2当前的接口不防刷,会被恶意攻击 所以在controller层增加请求拦截,如果你的token不合法,就不让你做后续的处理了 拦截器的作用是什么 作用: 1、对controller层代码的访问进行拦截,合法的请求,那此层代码就处理,反…...

美团 AIGC产品经理面经(已拿 offer)

背景:211本科毕业,毕业之后在北京一家中型电商公司做了3年商家后台产品经理,目前通过老薛的朋友关系拿到了美团的offer。 目前还有几家在面试流程中,继续加油💪 美团AIGC产品面经-业务面 💥1、自我介绍&a…...

@RequestBody与@RequestParam

RequestBody会将请求体中的数据,转换成对象.最主要的是RequestBody就是要返回Json的字符串!!! RequestParam会从http请求查询参数中提取数据! RequestParam和RequestBody是Spring Framework中用于处理HTTP请求的注解…...

vmware上,虚机经常丢失网卡。导致无法上网。

1、winR 输入 services.msc 2、重启这两个服务。 VMware NAT service和VMware DHCP service...

git 鉴权失败

这条错误信息通常出现在使用Git进行远程操作时,比如克隆仓库、拉取更新或推送代码。错误的含义是: HTTP Basic: Access denied:访问被拒绝。The provided password or token is incorrect:提供的密码或令牌不正确。Your account …...

[C++] 容器适配器:深入理解Stack与Queue的底层原理

文章目录 容器适配器简介deque的缺陷为什么使用deque作为stack和queue的底层默认容器 stack和queue的简单讲解Stack(栈)栈的操作图示栈的相关接口 Queue(队列) Stack和Queue的模拟实现Stack(栈)作为容器适配…...

Eclipse maven 的坑

在使用 eclipse 时, eclipse 的右下角 一直在提示 “JPA java change event handler” ,eclipse使用起来很卡,解决办法 问题描述: 在使用 eclipse时, eclipse 的右下角 一直在提示 “JPA java change event handler”…...

多模态视觉大语言模型——LLaVA

论文题目:Visual Instruction Tuning 论文地址:https://arxiv.org/abs/2304.08485 github: https://github.com/haotian-liu/LLaVA 1. Abstract 本文首次尝试使用GPT-4生成多模态指令数据,并基于这些数据训练了LLaVA(Large Language and Vision Assistant)模型,这是一种结…...

服务注册到nacos上,不能点击下线的问题处理

nacos不能下线: 修改 /usr/local/mid/nacos/data 文件夹下 protocol 文件重命名为 protocol_bak,然后再重启nacos nacos单机启动命令:cd sh startup.sh -m standalone nginx启动命令:cd /usr/local/mid/nginx/sbin ./…...

未来3-5年,哪些工作会被AI取代

一篇由高盛经济学家约瑟夫布里格斯 (Joseph Briggs)和德维西科德纳尼 (Devesh Kodnani)撰写的报告指出,全球预计将有3亿个工作岗位被生成式AI取代。 报告称:“最近出现的生成式人工智能将降低劳动力成本和…...

鸿蒙系统开发【网络管理】

网络管理 介绍 此Demo展示如何查询网络详情、域名解析、网络状态监听等功能。 效果预览: 使用说明: 1.启动应用,在点击检查网络、网络详情、网络连接信息后,展示对应的信息; 2.在域名解析的模块下,输入…...

nginx如何处理请求

nginx如何处理请求 注:内容翻译自Nginx官网文档 How nginx processes a request。 基于名称的虚拟服务器 nginx首先要决定哪个服务器应该处理请求。让我们从一个简单的配置开始,三个虚拟服务器都监听在端口*:80: server {listen 80;server_name e…...

换地不换IP?揭秘微博IP地址的奥秘

在这个信息飞速传递的时代,社交媒体成为我们生活中不可或缺的一部分。微博,作为其中的佼佼者,不仅是我们获取资讯的重要渠道,也是展现自我、分享生活的重要平台。然而,你有没有遇到过这样的情况:明明已经换…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...