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

MySQL专题Day(2)————存储引擎

  博主工作繁忙停更了部分时间,终于有个周末能回来更新了,闲话少说开啃MySQL,今天我们聊聊存储引擎。

目录

存储引擎简介

查看当前版本MySQL支持的引擎命令

InnoDB引擎简介 🚀

🔍 核心特点详解

📂 存储文件特点

⚙️ 关键参数:innodb_file_per_table

InnoDB逻辑存储结构

MyISAM引擎简介 🏎️

🔍 核心特点详解

📂 存储文件特点

⚙️ 关键参数:key_buffer_size

💎 总结优劣与适用场景

优势:

劣势:

适用场景:

Memory引擎简介 ⚡

🔍 核心特点详解

📂 存储文件特点

⚙️ 关键参数:max_heap_table_size

作用:

配置建议:

💎 总结优劣与适用场景

优势:

劣势:

经典适用场景:


存储引擎简介

  存储引擎是存储数据、建立索引、更新/查询数据等技术实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型。在MySQL中常见的引擎分为InnoDB、MyISAM、Memory等三种引擎结构。

查看当前版本MySQL支持的引擎命令

show engines; --SHOW ENGINES
Windows终端查看MySQL支持引擎

InnoDB引擎简介 🚀

  InnoDB是MySQL数据库中最流行的存储引擎之一,它完美平衡了高可靠性和高性能,使其成为企业级应用的理想选择。自MySQL 5.5版本起,InnoDB取代了MyISAM成为默认的存储引擎(在此之前,MyISAM是主流)。其强大的事务支持和并发处理能力,使其广泛应用于电子商务、金融系统等需要高数据完整性的场景。

🔍 核心特点详解

InnoDB的设计理念是确保数据的安全和高效访问,以下是其关键特性:

  • 支持事务(ACID模型)🔒:InnoDB严格遵守ACID原则(原子性、一致性、隔离性、持久性),确保DML操作(如INSERT、UPDATE、DELETE)在失败时能回滚,保证数据一致性。例如,在银行转账中,事务能防止中途失败导致的数据丢失问题。💼
  • 行级锁机制🚀:与表级锁不同,InnoDB采用行级锁定,允许多个用户同时读写同一表的不同行,大幅提升并发性能。这在高流量网站中尤为关键,避免了锁竞争导致的性能瓶颈。📈
  • 外键约束支持🔗:InnoDB内置FOREIGN KEY功能,能自动维护表间关系,确保数据引用完整性(如订单表必须引用有效的客户ID)。这防止了脏数据或无效关联,提升数据质量。✅
  • 崩溃恢复能力强💪:通过预写日志(WAL)机制,InnoDB在数据库崩溃后能快速恢复数据,最小化数据丢失风险,这对24/7系统至关重要。🛡️

📂 存储文件特点

InnoDB引擎的存储结构高度优化,每张表对应一个独立的表空间文件:

  • 文件格式:*.ibd:其中“*”代表表名(如mytable.ibd),这个文件存储了表的所有数据,包括表结构(通过.frm.sdi文件描述)、实际数据行和索引。🎯
  • 文件内容详解
    • 表结构:存储元数据(如列定义),早期使用.frm文件,现在整合到.ibd中或通过.sdi(Serialized Dictionary Information)管理。
    • 数据和索引:采用聚簇索引结构,主键索引直接存储数据行,二级索引引用主键值,这优化了查询速度。例如,频繁查询的列能快速定位。🔍
  • 优点:独立文件设计简化了备份和迁移(如通过innodb_file_per_table参数控制),避免了全局表空间的管理复杂性。📦

⚙️ 关键参数:innodb_file_per_table

  • 作用:这个参数控制InnoDB是否为每张表创建独立的.ibd文件。默认启用(ON),推荐在生产环境中使用,因为它:
    • 提升灵活性:便于单表备份、恢复或移动(如用ALTER TABLE迁移表)。🔄
    • 优化空间:减少碎片化,提高存储效率;如果禁用(OFF),所有表共享一个系统表空间,可能导致性能下降。📏
  • 配置示例:在MySQL配置文件中设置:
innodb_file_per_table=ON

启用后,新表会自动生成.ibd文件,而旧表需手动转换。💻

InnoDB逻辑存储结构

注意:一个区大小固定为1MB = 64页 = 64 * 16KB。

MyISAM引擎简介 🏎️

MyISAM是MySQL早期版本的默认存储引擎(5.5版本前),以其轻量级、高性能的读取操作而闻名。虽然现在InnoDB因其事务支持成为主流,但MyISAM仍在某些特定场景(如只读数据仓库、日志分析)中发挥重要作用。它不支持事务和行级锁,但提供了简单的表级锁机制和高效的全文索引功能。


🔍 核心特点详解

MyISAM的设计注重快速读取和简单性,以下是其核心特性:

表级锁机制🔒
MyISAM使用表级锁,即在对表进行写操作(INSERT/UPDATE/DELETE)时会锁定整个表,读操作则共享锁。这在高并发写场景下可能导致性能瓶颈,但适合读多写少的应用(如博客系统、报表查询)。📊

全文索引支持🔍
MyISAM内置全文索引(FULLTEXT),支持对文本字段的高效关键词搜索(如文章内容检索),这在早期版本中是InnoDB不具备的优势。📝

高速读取性能🚀
由于无需维护事务日志和行级锁开销,MyISAM在纯读取操作(如SELECT查询)中速度极快,适合数据仓库或只读数据库。💨

无事务支持❌
MyISAM不支持事务(ACID),因此无法保证数据操作的原子性和回滚。例如,批量插入中途失败可能导致部分数据残留,需手动修复。⚡

压缩表功能📦
MyISAM支持压缩表(通过myisampack工具),可减少存储空间占用,适合归档历史数据。


📂 存储文件特点

MyISAM的存储结构简单,每张表对应三个独立文件:

  • 表结构文件*.frm
    存储表定义(元数据),与引擎无关,MySQL统一通过此文件管理结构。

  • 数据文件*.MYD(MyData)
    存储所有实际数据行,按插入顺序排列,支持动态或固定行格式。

  • 索引文件*.MYI(MyIndex)
    存储所有索引信息,包括主键、唯一索引和全文索引。

示例
mytable会生成三个文件:

  • mytable.frm(结构)

  • mytable.MYD(数据)

  • mytable.MYI(索引)

优点:文件分离便于手动备份和迁移,但需同时维护三个文件。


⚙️ 关键参数:key_buffer_size

作用
MyISAM使用键缓冲区(Key Buffer)缓存索引块,此参数控制分配给索引缓存的内存大小。合理配置可大幅提升查询性能。

配置建议

  • 默认值通常较小(如8M),对于索引较多的表需适当调大。

  • 在MySQL配置文件中设置:

    key_buffer_size = 512M

注意
仅缓存索引,数据依赖操作系统文件缓存,因此内存充足时性能更佳。💻


💎 总结优劣与适用场景

优势

  • 读取速度快,适合OLAP(在线分析处理)和只读负载。

  • 全文索引简化文本搜索需求。

  • 存储文件结构简单,易于理解和维护。

劣势

  • 表级锁限制并发写性能。

  • 无事务和崩溃恢复能力,断电或故障可能导致数据损坏(需使用myisamchk修复)。

适用场景

  • 日志分析、数据仓库等读密集型应用。

  • 全文检索需求且无高并发写的系统。

  • 临时表或缓存表(MySQL内部常用MyISAM作为临时表引擎)。


Memory引擎简介 ⚡

Memory(也称HEAP)引擎是MySQL中一个极为特殊的存储引擎,其所有数据都存储在内存中,因此提供了无与伦比的读写速度。顾名思义,它就像是数据库的“高速缓存”,读写操作比任何基于磁盘的引擎都快好几个数量级。但由于其易失性,服务器重启后所有数据都会丢失,这使其非常适合用作临时表、缓存或会话存储等场景。


🔍 核心特点详解

Memory引擎的设计目标是追求极致速度,其核心特性围绕内存操作展开:

内存存储,速度极致💨
  所有数据都驻留在RAM中,无需磁盘I/O,这使得查询和更新操作都非常快。通常用于缓存中间结果或高频访问的只读数据。

表级锁机制🔒
  和MyISAM类似,Memory使用表级锁。这在并发写操作时可能成为瓶颈,但由于其速度极快,锁竞争的影响通常比磁盘引擎小。

不支持事务与崩溃安全❌
  不支持ACID事务,也不提供任何持久性保证。服务器重启或崩溃会清空所有数据,因此绝不能用于存储重要业务数据。

支持哈希索引与B树索引🌳
  默认使用哈希索引(HASH index),这使得等值查询(=IN)极快,但范围查询(><BETWEEN)效率低下。您也可以显式指定创建B树索引(BTREE),使其支持高效的的范围查询和排序。

变长字段存储为定长📏
  为了优化内存访问速度,Memory引擎会将VARCHAR等变长字段转换为定长(CHAR)来存储。这可能会浪费部分内存,但换来了更快的访问速度。


📂 存储文件特点

Memory引擎的存储方式非常独特,因为它根本不持久化数据:

  • 表结构文件*.frm
    与其它引擎一样,Memory引擎的表结构定义也存储在 .frm 文件中。这是唯一会持久化到磁盘的文件。

  • 数据与索引文件
    所有数据和索引都仅存在于内存中。MySQL服务重启后,表结构会保留,但数据会全部消失,表会变成一个空壳。

示例
创建表 my_cache 后,磁盘上只会生成一个文件:my_cache.frm

优点:极致的速度,零磁盘碎片。
缺点:数据易失,无法持久化。


⚙️ 关键参数:max_heap_table_size

作用

此参数决定了每个Memory引擎表所能使用的最大内存容量。默认值通常较小(如16MB),如果表的数据量超过这个限制,会导致查询失败并报错。

配置建议

  • 需要根据实际缓存数据量的大小来调整此参数。

  • 在MySQL配置文件(my.cnfmy.ini)中设置:

    max_heap_table_size = 256M
  • 注意:此参数的上限受全局参数 max_connections 和 tmp_table_size 的影响。

另一个相关参数default_storage_engine 和 internal_tmp_disk_storage_engine。Memory引擎常被MySQL内部用于存储临时表,您可以通过 internal_tmp_disk_storage_engine 参数控制当临时表大小超过 tmp_table_size 时,是转换为磁盘引擎(如InnoDB)还是报错。💻


💎 总结优劣与适用场景

优势

  • 速度之王:读写性能是所有MySQL引擎中最快的,没有之一。

  • 实现简单:非常适合作为缓存层,减轻核心业务表的压力。

  • 零碎片:由于数据不在磁盘存储,完全不存在磁盘碎片问题。

劣势

  • 数据易失:重启必丢数据,只能用于临时数据存储。

  • 容量受限:表大小受 max_heap_table_size 参数和物理内存容量限制。

  • 并发局限:表级锁在高并发写场景下性能会下降。

经典适用场景

  • 临时计算中间表:存储复杂的SQL查询在中间步骤产生的临时结果。

  • 高频只读缓存:缓存热点数据,如网站的分类列表、配置信息等。(通常需要应用层配合实现预热机制,在重启后重新加载数据)。

  • 会话(Session)存储:在一些架构中,用于存储用户会话信息。

  • 统计分析中的临时工作区:进行ETL操作时,在内存中快速处理和转换数据。

⚠️ 重要提醒:Memory引擎是一把锋利的“双刃剑”。它提供了极致性能,但也伴随着数据易失的风险。在使用前,请务必确保业务场景能够接受数据丢失。对于需要持久化的数据,请始终选择InnoDB!Memory的有关业务问题解决方法,如今可由Redis等的中间件来解决。


文章转载自:

http://w5Wkj6SE.jsxrm.cn
http://C96inM7x.jsxrm.cn
http://WjWXG0Ah.jsxrm.cn
http://QMCScB0j.jsxrm.cn
http://8HN9pz6M.jsxrm.cn
http://JZtwCCfV.jsxrm.cn
http://fSJ5oHMa.jsxrm.cn
http://zhKOkTJ5.jsxrm.cn
http://fbhZqxaB.jsxrm.cn
http://6SspgoTL.jsxrm.cn
http://2BiORbbB.jsxrm.cn
http://MW6HqTu1.jsxrm.cn
http://QoTr2bme.jsxrm.cn
http://AHkeX4Ki.jsxrm.cn
http://8HAIneTv.jsxrm.cn
http://7CbXDpfW.jsxrm.cn
http://JEZfBPig.jsxrm.cn
http://dB8JhJaS.jsxrm.cn
http://KZ0q7sEs.jsxrm.cn
http://6hrTtIUA.jsxrm.cn
http://YsvOUH6u.jsxrm.cn
http://4V6faHTB.jsxrm.cn
http://c2zLyf8z.jsxrm.cn
http://r1cOt7PR.jsxrm.cn
http://I1JrVNNZ.jsxrm.cn
http://ZiJ8O2Ef.jsxrm.cn
http://BGUljsGe.jsxrm.cn
http://KxFh67BP.jsxrm.cn
http://XXcof7wr.jsxrm.cn
http://CM4iXLkE.jsxrm.cn
http://www.dtcms.com/a/383440.html

相关文章:

  • 多文件编程与宏的使用
  • 第5节-连接表-Inner-Join
  • 【Csp - S】 图的知识
  • 【图文详解】MCP、A2A的核心技术特点以及架构模式
  • Java基础 9.13
  • Shell 正则表达式完全指南
  • 玩转ClaudeCode:用Database-MCP实现自然语言操作数据库
  • 【Android】答题系统Web服务器APP应用开发流程详解
  • Web服务器VS应用服务器:核心差异解析
  • 分享一个vue2的tinymce配置
  • spring bean一共有几种作用域
  • Redie详细入门教程2
  • Maven入门_简介、安装与配置
  • Vue组件化开发介绍
  • ​new species of flying reptile1 discovered in Scotland​
  • Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战
  • 闪电科创 SCI专业辅导
  • 【数据结构与算法】图 Floyd算法
  • 代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
  • IDEA编译器设置代码注释模板
  • 10-鼠标操作的处理
  • efcore 对象内容相同 提交MSSQL后数据库没有更新
  • Docker 容器化
  • 玩转Docker | 使用Docker部署OmniTools自托管IT工具箱
  • 类的组合(对比继承)
  • python爬虫的逆向技术讲解
  • Cookie 和 Session
  • 【WebSocket✨】入门之旅(四):WebSocket 的性能优化
  • 40分钟的Docker实战攻略
  • JavaScript 运算符完全指南:从基础到位运算