InnoDB和MyISAM的比较、水平切分和垂直切分、主从复制中涉及的三个线程、主从同步的延迟产生和解决
InnoDB和MyISAM的比较

事务支持:
- InnoDB支持:支持事务 (ACID 属性)。支持 Commit、Rollback 和 Savepoint 操作。适合需要事务处理的应用,例如银行系统。
- MyISAM:不支持事务。每次操作都是自动提交,不能回滚或中止。适合对事务要求不高的应用,例如简单的读写操作。
锁机制:
- InnoDB:支持行级锁(Row-Level Locking),并发性能更好。通过多版本并发控制(MVCC)实现高效的并发读写。适合高并发写入场景。
- MyISAM:只支持表级锁(Table-Level Locking),并发性能较低。插入或更新操作会锁住整个表,导致其他线程无法访问表。
外键:
- InnoDB:支持外键约束,能维护表间数据的一致性。在定义表时,可以指定 ON DELETE 和 ON UPDATE 操作。
- MyISAM:不支持外键约束。表间的引用完整性需要通过应用逻辑自行维护。
崩溃恢复:
- InnoDB:具备崩溃恢复能力。使用事务日志(Redo Log)和双写缓冲(Doublewrite Buffer)技术,在崩溃时可以恢复数据。适合关键数据场景。
- MyISAM:崩溃后可能会丢失数据或导致表损坏。提供 myisamchk 工具用于表修复,但不如 InnoDB 的自动恢复机制可靠。
性能比较:
- InnoDB:在写密集型、需要事务支持和高并发的场景下表现更优。由于支持事务和行级锁,写操作的开销较高。数据检索可能稍慢,但适合频繁的更新操作。
- MyISAM:读操作性能通常优于 InnoDB,适合读多写少的场景。因为不支持事务和行级锁,插入和查询开销较低。不适合频繁写入或需要高并发写的场景。
数据存储结构:
- InnoDB:聚簇索引(Clustered Index),主键索引和数据存储在同一个结构中。数据按主键顺序存储,非主键索引存储主键值的引用。更适合主键查询和范围查询。
- MyISAM:使用非聚簇索引,索引和数据分开存储。索引指向数据的物理位置。更适合频繁的全表扫描。
存储空间:
- InnoDB:占用更多的磁盘空间,因为需要维护事务日志和外键约束。表和索引数据存储在一个共享表空间或单独的 .ibd 文件中。
- MyISAM:相对较小的存储空间。表存储在 .MYD 和 .MYI 文件中,索引和数据分开管理。
全文索引:
- InnoDB:从 MySQL 5.6 开始支持全文索引,但性能一般。
- MyISAM:原生支持全文索引,适合需要全文检索的场景(如搜索引擎)。
应用场景:
- InnoDB:适用于需要事务支持、高并发写入和数据一致性的重要系统。例如:电子商务、银行、财务管理等。
- MyISAM:适用于读操作多、写操作少且对事务要求不高的系统。例如:日志系统、数据分析、简单内容管理系统等。
如果你的应用需要事务支持、数据一致性和高并发,选择 InnoDB。如果你的应用主要是读操作、不需要事务且需要较高的查询性能,选择 MyISAM。随着 MySQL 的发展,InnoDB 已经成为默认的存储引擎,未来的开发中推荐优先使用 InnoDB。
水平切分和垂直切分
水平切分: 水平切分是将数据按行划分到不同的数据库表或实例中,每个分片(shard)包含完整的列结构,但存储不同的数据行。
- 每个分片的数据结构相同(包含所有列)。
- 适合数据量大、查询操作以行为单位的场景。
- 常用于分表或分库。
优点:
- 分散压力:将数据分散到多个存储节点,减小单节点的存储和查询压力。
- 可扩展性强:数据增长时,只需增加新的分片。
- 高性能:适合对单行数据的查询和更新操作。
缺点:
- 跨分片查询复杂:需要额外的逻辑协调多个分片的查询结果。
- 分片策略设计难度大:需要选择合适的分片键。
- 数据迁移:当分片策略调整时,需要重新分布数据。
使用场景:
- 大型互联网系统,数据量巨大(如社交网络、电子商务)。
- 以用户 ID、订单 ID 等为主键进行查询的场景。
垂直切分:将数据库表按列划分,每个分片(shard)存储不同的列,以减少单表的列数或将功能模块拆分到不同的数据库中。
- 每个分片包含不同的列,按功能模块划分。
- 适合表结构复杂、列数较多或模块化设计的场景。
优点:
- 优化性能:减少单表的列数,提高缓存命中率。
- 模块化管理:不同模块的表可以存储在不同的数据库中,方便管理。
- 更高的并发性:不同模块的数据可分散到不同的服务器上,提高并发处理能力。
缺点:
- 查询复杂度增加:需要多表联合查询时性能下降。
- 耦合性高:切分后可能需要在应用层处理表间关联逻辑。
- 扩展性有限:当数据量持续增长时,仍需要进一步进行水平切分。
使用场景:
- 数据库中存在宽表(列数非常多)的情况。
- 系统需要根据业务模块划分(如用户模块、订单模块、支付模块)。
- 适合中小型数据库优化,避免数据表过宽导致性能下降。

注意事项:
很多人对水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢?
MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。
主从复制中涉及的三个线程
主从复制(Master-Slave Replication) 是数据库的一种数据复制机制,用于在主数据库(Master)和从数据库(Slave)之间同步数据。主数据库负责处理写操作,从数据库负责处理读操作。它能够提高数据的可用性、扩展读性能并提供数据备份的能力。
Binlog Thread(主库上的线程):
- 从库连接主库后,主库为这个连接分配一个 Binlog线程。
- 将更新写入二进制文件,并维护文件的一个索引来跟踪日志循环
I/O Thread(从库上的线程):
- 从库通过
CHANGE MASTER TO命令指定主库的地址和同步信息,然后启动 I/O 线程。 - I/O 线程与主库的 Binlog Dump 线程建立连接。
- 它从主库接收二进制日志并存储到从库的中继日志(relay log)中。
SQL Thread(从库上的线程) :
- SQL 线程从中继日志中按顺序读取事务。
- 它依次在从库中执行这些事务,保证从库的数据与主库保持一致。
会产生的问题:
- 网络延迟:I/O 线程和 Binlog Dump 线程之间的通信速度可能会影响同步延迟。
- 事务一致性:如果 SQL 线程执行速度不够快,中继日志可能堆积,导致从库落后主库。
- 并行复制:在高负载场景下,可以使用多线程复制(如 MySQL 的并行复制功能)提高性能。
主从同步的延迟产生和解决方法
主从复制延迟(Replication Lag)指的是从库的数据落后于主库的时间差。这种延迟会影响读取一致性、数据实时性,甚至在某些业务场景下可能引起错误。
主从复制延迟产生原因:
- 主库写入负载过高:主库在短时间内写入大量数据,生成二进制日志(Binlog)的速度很快,而从库的处理速度跟不上,导致积压。
- 网络传输瓶颈:主库的 Binlog Dump 线程将日志传送给从库时,网络延迟、带宽不足或丢包问题会拖慢日志传输速度。
- 从库 I/O 线程瓶颈:从库的 I/O 线程负责从主库拉取日志,如果网络或系统 I/O 性能较差,会导致日志拉取不及时,进而引发延迟。
- 从库 SQL 线程处理能力不足:从库 SQL 线程需要依次读取中继日志(Relay Log)并执行日志中的事务。如果从库硬件性能较低(如 CPU、内存、磁盘 I/O)或存在锁争用,从库执行事务的速度会明显低于主库写入速度。
- 单线程复制限制:传统 MySQL 复制模式下,从库的 SQL 线程是单线程执行的,在处理大量事务或长事务时,容易形成瓶颈。
- 大事务或长事务:大事务或一次性提交大量更新的数据,日志量大且事务执行时间长,会拖慢从库的执行进程。
解决办法:
- 升级硬件
- 合理配置系统参数
- 改善网络环境
- 调整 Binlog 刷新策略(主库上可以调整
sync_binlog参数,在保证数据安全的前提下适当提高日志同步效率。) - 采用并行复制(MySQL 5.7 及以上版本支持并行复制,从库可以配置多个并行工作线程(通过
slave_parallel_workers参数),从而利用多核 CPU 并行执行事务。注意:并行复制通常需要在事务之间独立(如基于数据库或基于事务组的复制模式),如果事务间存在依赖,可能无法并行。) - 专用只读从库(将从库专用于只读查询,避免在从库上执行写操作或其他重负载任务,确保 SQL 线程资源充足。)
- 读写分离策略(在应用层面配置读写分离,使得对数据一致性要求不高的查询请求直接访问从库,从而减少主从复制的负担。)
相关文章:
InnoDB和MyISAM的比较、水平切分和垂直切分、主从复制中涉及的三个线程、主从同步的延迟产生和解决
InnoDB和MyISAM的比较 事务支持: InnoDB支持:支持事务 (ACID 属性)。支持 Commit、Rollback 和 Savepoint 操作。适合需要事务处理的应用,例如银行系统。MyISAM:不支持事务。每次操作都是自动提交,不能回滚或中止。适合对事务要求…...
JDK9新特性
文章目录 新特性:1.模块化系统使用模块化module-info.java:exports:opens:requires:provides:uses: 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量:/var…...
基于Ubuntu2404搭建Zabbix7.2
Zabbix 搭建zabbix zabbix7.2已推出:官网 增加的新功能如下: 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…...
Math Reference Notes: 符号函数
1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…...
【数据结构】链表应用-链表重新排序
重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…...
学习threejs,pvr格式图片文件贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…...
数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)
10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋…...
2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码
目录 附录1:拓扑图编辑 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.EG1 14.EG2 15.AP2 16.AP3 附录1:拓扑图 附录2:地址规划表...
100.7 AI量化面试题:如何利用新闻文本数据构建交易信号?
目录 0. 承前1. 解题思路1.1 数据处理维度1.2 分析模型维度1.3 信号构建维度 2. 新闻数据获取与预处理2.1 数据获取接口2.2 文本预处理 3. 情感分析与事件抽取3.1 情感分析模型3.2 事件抽取 4. 信号生成与优化4.1 信号构建4.2 信号优化 5. 策略实现与回测5.1 策略实现 6. 回答话…...
【前端】【Ts】【知识点总结】TypeScript知识总结
一、总体概述 TypeScript 是 JavaScript 的超集,主要通过静态类型检查和丰富的类型系统来提高代码的健壮性和可维护性。它涵盖了从基础数据类型到高级类型、从函数与对象的类型定义到类、接口、泛型、模块化及装饰器等众多知识点。掌握这些内容有助于编写更清晰、结…...
【前端】【Ts】TypeScript的关键知识点
一、知识点总结 (一)void 与 never 的区别 (1) void:声明函数无返回值,但可以走到 return 行。(2) never:表示函数不会走到 return 行,常用于抛异常或无限循环。 (二)字面量类型与联…...
C++,STL,【目录篇】
文章目录 一、简介二、内容提纲第一部分:STL 概述第二部分:STL 容器第三部分:STL 迭代器第四部分:STL 算法第五部分:STL 函数对象第六部分:STL 高级主题第七部分:STL 实战应用 三、写作风格四、…...
2502vim,vim文本对象中文文档
介绍 文本块用户(textobj-user)是一个可帮助你毫不费力地创建自己的文本对象的Vim插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…...
【AI论文】直接对齐算法之间的差异模糊不清
摘要:直接对齐算法(DAAs)通过在对齐人类反馈的强化学习(RLHF)中用直接策略优化替代强化学习(RL)和奖励建模(RM),简化了语言模型对齐过程。DAAs可以根据其排序…...
(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,
(11) 查看断点 info b: # info b举例: (12)删除断点 delete 2 或者删除所有断点: # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车,之后输入 y 确认删除所有断点 举…...
中间件的概念及基本使用
什么是中间件 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲:Tomcat、WebLogic、Redis、IIS;狭义上来讲,ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…...
什么是ce认证
CE认证,即只限于产品不危及人类、动物和货品的安全方面的基本安全要求,而不是一般质量要求,协调指令只规定主要要求,一般指令要求是标准的任务。因此准确的含义是:CE标志是安全合格标志而非质量合格标志。是构成欧洲指令核心的&qu…...
S4 HANA手工记账Tax Payable – FB41
本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容: 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账,一般税码科目需要设置为只能自动记账,因此无法手工对税码统驭科目记账,但…...
Java 大视界 -- Java 大数据在智慧文旅中的应用与体验优化(74)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
[leetcode]两数之和等于target
源代码 #include <iostream> #include <list> #include <iterator> // for std::prev using namespace std; int main() { int target 9; list<int> l{ 2, 3, 4, 6, 8 }; l.sort(); // 确保列表是排序的,因为双指针法要求输入是…...
老游戏回顾:G2
一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去,古拉纳斯将希望之光给予人们,人类令希望之光不断扩大,将繁荣握在手中。 但是,暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战,…...
行为驱动开发(BDD)如何提高自动化测试效率
在软件开发的过程中,自动化测试一直扮演着至关重要的角色。随着需求变化日益复杂、开发周期不断压缩,如何提升自动化测试的效率和准确性成为了现代软件开发团队的核心挑战之一。行为驱动开发(BDD,Behavior Driven Development&…...
大语言模型的「幻觉」(Hallucination)是指模型在生成内容时
大语言模型的「幻觉」(Hallucination)是指模型在生成内容时,输出看似合理但实际错误、虚构或与事实不符的信息。这种现象并非模型有意欺骗,而是由其底层技术原理和训练方式导致的必然结果。 幻觉的核心特征 类型示例事实性错误生…...
[25] cuda 应用之 nppi 实现图像色彩调整
[25] cuda 应用之 nppi 实现图像色彩调整 在 NPPI(NVIDIA Performance Primitives)中,图像色彩调整通常包括以下几种操作: 亮度调整:增加或减少图像的亮度。对比度调整:增强或减弱图像的对比度。饱和度调…...
Redis常见数据类型与编码方式
⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHu…...
inter i5 6300U 可以干嘛
Intel Core i5-6300U 是一款发布于 2015 年的双核四线程处理器,属于 Intel 第六代 Skylake 架构的低功耗移动处理器(TDP 15W)。虽然它不是最新的处理器,但在日常使用中仍然可以胜任许多任务。以下是它适合的用途: 1. 日…...
不可控的内存分配(CWE-789)
漏洞描述:内存分配的大小受外部控制的输入数据影响,且程序没有指定内存分配大小的上限 漏洞风险:攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而奔溃。 修复或规避建议: 设定合理的内存分配上限&…...
大型三甲医院算力网络架构的深度剖析与关键技术探索
一、引言 1.1 研究背景与意义 1.1.1 医疗信息化发展趋势 随着信息技术的迅猛发展,全球医疗行业正经历着深刻的数智化转型。数字化转型已成为医疗行业提升服务质量、优化运营效率、推动医学科研创新的关键驱动力。从电子病历系统的普及到远程医疗的广泛应用&#…...
获取要素类或表中的字段列表
要素类和表中往往包含一个或多个属性信息,可以通过ListFields()函数获取要素类中的字段列表. 操作方法: 1.打开IDLE,新建一个脚本窗口 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "" 4.在try语句中对<>要素调用ListFields()方法 try:fieldlis…...
Android原生开发入门
1. 资源地址 Android官方教程Android参考手册 2. 必看基础模块 应用基础知识View 绑定 :绑定相当于Qt中的ui文件生成界面代码的机制,Qt中的ucc会自动将ui文件编译成ui_xxxx.h文件,Android开发中也一样。 Android中自动生成的代码在&#x…...
