当前位置: 首页 > 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地址的奥秘

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

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...