MySQL 体系结构与存储引擎

目录

一、MySQL 体系结构

1. 连接层 (Connection Layer)

2. 服务层 (Server Layer)

3. 存储引擎层 (Storage Engine Layer)

二、MySQL 核心存储引擎比较

1. InnoDB (默认引擎)

2. MyISAM

3. Memory (HEAP)

4. 其他存储引擎

三、InnoDB 存储引擎深度解析

1. 核心架构组件

2. 关键特性

3. 缓冲池(Buffer Pool)优化

四、存储引擎选择策略

1. 选择标准

2. 混合使用场景

五、存储引擎性能优化

1. InnoDB 优化

2. MyISAM 优化

六、存储引擎监控与诊断

1. InnoDB 监控

2. 性能诊断工具

七、MySQL 8.0 存储引擎新特性

1. InnoDB 增强

2. 通用表空间

3. 数据字典改进

八、存储引擎最佳实践


一、MySQL 体系结构

MySQL 采用分层架构设计,主要分为以下三层:

1. 连接层 (Connection Layer)

  • 负责客户端连接处理、授权认证。

  • 管理连接线程和会话变量。

  • 协议支持:TCP/IP、Unix Socket、Named Pipe。

2. 服务层 (Server Layer)

  • SQL Interface:接收SQL语句,返回结果。

  • Parser:SQL解析器,生成解析树。

  • Optimizer:查询优化器,生成执行计划。

  • Caches & Buffers:查询缓存、表缓存等。

3. 存储引擎层 (Storage Engine Layer)

  • 负责数据的存储和检索。

  • 插件式架构,支持多种存储引擎。

  • 与文件系统交互,管理物理文件。

二、MySQL 核心存储引擎比较

引擎事务支持锁粒度崩溃恢复适用场景
InnoDB行级锁支持OLTP、高并发事务处理
MyISAM表级锁不支持读密集型场景(已逐渐被取代)
Memory表级锁不支持临时表、会话级缓存数据
Archive行级锁支持历史数据存储与压缩
CSV表级锁不支持CSV文件映射表

1. InnoDB (默认引擎)

特点

  • 支持完整ACID事务

  • 行级锁定

  • 外键支持

  • 支持崩溃恢复

  • 使用聚集索引(主键索引包含完整数据)

适用场景

  • 需要事务支持的OLTP应用

  • 高并发读写

  • 需要外键约束的应用

文件结构

  • .ibd 文件:表空间文件(每个表单独文件)

  • ibdata1:系统表空间(共享表空间)

  • ib_logfile0/1:重做日志文件

2. MyISAM

特点

  • 不支持事务

  • 表级锁定

  • 全文索引支持

  • 较高的读取性能

  • 使用非聚集索引(索引和数据分离)

适用场景

  • 只读或读多写少的应用

  • 需要全文索引的应用

  • 数据仓库类应用

文件结构

  • .frm:表结构定义文件

  • .MYD:数据文件

  • .MYI:索引文件

3. Memory (HEAP)

特点

  • 数据存储在内存中

  • 表级锁定

  • 不支持BLOB/TEXT类型

  • 服务器重启后数据丢失

适用场景

  • 临时表

  • 缓存中间结果

  • 高速查找表

4. 其他存储引擎

引擎名称特点适用场景
Archive高压缩比,只支持INSERT/SELECT日志归档
CSV数据以CSV格式存储数据交换
Federated访问远程MySQL表分布式应用
Merge合并多个MyISAM表数据仓库

三、InnoDB 存储引擎深度解析

1. 核心架构组件

内存结构

  • Buffer Pool:缓存表和索引数据

  • Change Buffer:缓存非唯一索引的变更

  • Adaptive Hash Index:自动构建哈希索引

  • Log Buffer:重做日志缓冲区

磁盘结构

  • Tablespaces:系统表空间、独立表空间、通用表空间

  • Redo Logs:事务日志(ib_logfile)

  • Undo Logs:回滚日志(存储在系统表空间)

2. 关键特性

事务实现机制

  • MVCC (多版本并发控制):通过ReadView实现一致性读

  • Undo Log:记录修改前的数据用于回滚

  • Redo Log:记录修改后的数据用于恢复

锁机制

  • 共享锁(S锁):读锁,允许多个事务同时读取

  • 排他锁(X锁):写锁,独占资源

  • 意向锁(IS/IX):表级锁,提高锁检查效率

  • 记录锁(Record Lock):锁定索引记录

  • 间隙锁(Gap Lock):锁定索引记录间隙

  • 临键锁(Next-Key Lock):记录锁+间隙锁组合

3. 缓冲池(Buffer Pool)优化

 -- 查看缓冲池状态SHOW ENGINE INNODB STATUS\G​-- 重要配置参数innodb_buffer_pool_size = 8G  # 通常设为物理内存的50-75%innodb_buffer_pool_instances = 8  # 缓冲池实例数innodb_old_blocks_pct = 37  # LRU列表中old子列表占比innodb_old_blocks_time = 1000  # 页在old子列表停留时间(ms)

四、存储引擎选择策略

1. 选择标准

  • 事务需求:需要事务选择InnoDB

  • 并发性能:高并发写选择InnoDB,读多写少考虑MyISAM

  • 特殊功能:全文索引、地理空间数据等

  • 恢复需求:需要崩溃恢复选择InnoDB

2. 混合使用场景

 -- 创建表时指定引擎CREATE TABLE logs (id INT AUTO_INCREMENT,log_time DATETIME,message TEXT,PRIMARY KEY (id)) ENGINE=Archive;​-- 修改表引擎ALTER TABLE my_table ENGINE=InnoDB;

五、存储引擎性能优化

1. InnoDB 优化

 -- 配置独立表空间innodb_file_per_table = ON​-- 调整日志文件大小innodb_log_file_size = 256Minnodb_log_files_in_group = 2​-- 优化IO特性innodb_flush_method = O_DIRECTinnodb_flush_neighbors = 0  # SSD建议关闭innodb_io_capacity = 2000   # 根据IOPS能力设置

2. MyISAM 优化

 -- 键缓存配置key_buffer_size = 256M​-- 修复表REPAIR TABLE my_table;​-- 优化表(重建索引)OPTIMIZE TABLE my_table;

六、存储引擎监控与诊断

1. InnoDB 监控

 -- 查看InnoDB状态SHOW ENGINE INNODB STATUS\G​-- 查看锁等待SELECT * FROM information_schema.INNODB_LOCKS;SELECT * FROM information_schema.INNODB_LOCK_WAITS;​-- 查看缓冲池统计SELECT * FROM information_schema.INNODB_BUFFER_POOL_STATS;

2. 性能诊断工具

 -- 查看表状态SHOW TABLE STATUS LIKE 'table_name'\G​-- 查看索引统计ANALYZE TABLE table_name;SHOW INDEX FROM table_name;​-- 查看引擎相关系统变量SHOW VARIABLES LIKE '%innodb%';SHOW VARIABLES LIKE '%myisam%';

七、MySQL 8.0 存储引擎新特性

1. InnoDB 增强

  • 原子DDL:DDL操作支持原子性

  • 哈希索引优化:改进自适应哈希索引

  • 临时表优化:临时表使用InnoDB引擎

  • JSON增强:改进JSON文档存储和查询

2. 通用表空间

 -- 创建通用表空间CREATE TABLESPACE `my_tablespace` ADD DATAFILE 'my_tablespace.ibd' ENGINE=InnoDB;​-- 将表分配到表空间CREATE TABLE t1 (id INT) TABLESPACE `my_tablespace`;ALTER TABLE t2 TABLESPACE `my_tablespace`;

3. 数据字典改进

  • 元数据存储在事务性数据字典中

  • 不再依赖.frm文件

  • 提高DDL操作的原子性和崩溃安全性

八、存储引擎最佳实践

  1. 生产环境统一使用InnoDB:除非有特殊需求

  2. 合理配置缓冲池大小:避免频繁磁盘IO

  3. 定期维护表:特别是MyISAM表

  4. 监控锁争用:及时发现性能瓶颈

  5. 考虑读写分离:读多写少场景可使用复制

  6. 测试新版本特性:如MySQL 8.0的哈希索引优化

通过深入理解MySQL体系结构和存储引擎特性,可以针对不同业务场景做出最优的数据库设计和配置选择,从而获得最佳的性能和可靠性。

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

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

相关文章

知识就是力量——物联网应用技术

基础知识篇 一、常用电子元器件1——USB Type C 接口引脚详解特点接口定义作用主从设备关于6P引脚的简介 2——常用通信芯片CH343P概述特点引脚定义 CH340概述特点封装 3——蜂鸣器概述类型驱动电路原文链接 二、常用封装介绍贴片电阻电容封装介绍封装尺寸与功率关系&#xff1…

vue复习1~45

1.关于vue 要理解记忆规则,可以到官网上去找 vue的两种使用方式 vue核心包开发 场景:局部模块改造vue核心包 & vue插件 工程化开发 场景:整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…

Netty和Project Reactor如何共同处理大数据流?

在处理大数据流时,Netty和Project Reactor可以协同工作,充分利用Netty的高性能非阻塞IO和Project Reactor的响应式编程模型,实现高效的数据处理和背压控制。以下是如何共同处理大数据流的详细步骤和示例代码: ### 1. Netty和Proj…

【Nginx】location匹配模式与规则

文章目录 一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大小写敏感)5. 正则模式(大小写不敏感) 三、需要注意的地方1. 命中多…

JavaScript基础-定时器

在Web开发中,有时我们需要延迟执行某些操作或者定期重复执行某段代码。JavaScript提供了强大的定时器功能,使得这些需求变得简单易行。本文将详细介绍JavaScript中的定时器,包括setTimeout和setInterval函数的使用方法、注意事项以及一些实际…

【Python】and 和 or 的返回值

文章目录 选项 A选项 B选项 C选项 D正确答案 以下哪些选项输出结果为True ( ) A、print(2 0 or True) B、print(2 ! 0 or True) C、print(str(2) and str(0) or True) D、print(str(2) or str(0) or True)要确定哪些选项的输出结果为 True,我们需要分析每个表达式的…

【deepseek 学c++】weakptr引用场景

std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针,它本身不拥有资源的所有权,仅观察资源的状态,主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值:![ 为…

新手SEO优化实战快速入门

内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…

如何用Redis统计网站的UV

在 Java 项目中使用 Redis 统计网站的 UV(独立访客数),我们可以利用 Redis 提供的 HyperLogLog 数据结构。HyperLogLog 适合用来做基数统计,它在空间复杂度上非常高效,可以在存储大量数据的情况下,提供非常…

Android系统的安全问题 - Android的启动时验证

Android 启动时验证(Verified Boot) Android 的 启动时验证(Verified Boot) 是一项关键安全机制,用于确保设备启动过程中加载的所有系统镜像(如 Bootloader、内核、系统分区)未被篡改&#xff…

【操作系统】(四)体系结构

(一)大内核与微内核 把橘色部分划分到内核中的操作系统属于大内核,不把橘色划到内核中的操作系统属于微内核 大内核与微内核的具体区别: (二)计算机的层次结构 (三)操作系统内核非内…

Kotlin 协程官方文档知识汇总(一)

1、协程基础 Kotlin 是一门仅在标准库中提供最基本底层 API 以便其他库能够利用协程的语言。与许多其他具有类似功能的语言不同,async 与 await 在 Kotlin 中并不是关键字,甚至都不是标准库的一部分。此外,Kotlin 的挂起函数概念为异步操作提…

MySQL 的 JSON 查询

MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件]路径组件详解 | 操作符 | 描述 | 示例 | | ----------- | --------- | ----------…

Wi-SUN技术,强势赋能智慧城市构筑海量IoT网络节点

在智慧城市领域中,当一个智慧路灯项目因信号盲区而被迫增设数百个网关时,当一个传感器网络因入网设备数量爆增而导致系统通信失效时,当一个智慧交通系统因基站故障而导致交通瘫痪时,星型网络拓扑与蜂窝网络拓扑在构建广覆盖与高节…

Leetcode13-罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 如同上一题&#xff0c;直接用暴力法破解&#xff0c;简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…

23种设计模式-责任链(Chain of Responsibility)设计模式

责任链设计模式 &#x1f6a9;什么是责任链设计模式&#xff1f;&#x1f6a9;责任链设计模式的特点&#x1f6a9;责任链设计模式的结构&#x1f6a9;责任链设计模式的优缺点&#x1f6a9;责任链设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】

🌟 这是星际大战系列的第三篇,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之处,欢迎各位朋友指出,让我们一起在交流中进步。 🎁 项目代码、文档和相关资源都可以免费获取,希望能帮助到更多对游戏开发感兴趣的朋友。 💌 如果您有任…

MyBatis-Plus(Ⅵ)插件

目录 一、分页插件 1.添加配置类 2.在测试类测试 结果 二、xml实现分页的自定义 1.UserMapper中定义接口方法 2.创建UserMapper.xml文件 3.在测试类测试 结果 三、乐观锁 1.场景 2.乐观锁与悲观锁 3.模拟修改冲突 数据库中添加商品表 添加数据 添加实体类 添加map…

火山引擎云上实战: DeepSeek R1 大模型(全尺寸)

本文将介绍两种在火山引擎云上部署 DeepSeek-R1 全尺寸模型服务的方案&#xff0c;涵盖大模型推理服务的 Terraform 一键部署、容器化部署、资源弹性伸缩和模型可观测。 来源 | 火山引擎云基础 在 AI 大模型日新月异的当下&#xff0c;企业在使用大模型时往往面临着数据隐私保…