【MySQL】存储引擎 - InnoDB详解

发布于:2025-05-09 ⋅ 阅读:(21) ⋅ 点赞:(0)

📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述


InnoDB 是一款兼顾高可靠性和高性能的通用存储引擎。在MySQL8.0中默认的存储引擎是 InnoDB

使用 CREATE TABLE 语句创建表时,在没有修改默认存储引擎或明确指定其他存储引擎时,将创建一个 InnoDB 的表。

🏳️‍🌈一、InnoDB存储引擎的特性

在这里插入图片描述

🏳️‍🌈二、|nnoDB 的主要优势

  1. DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。事务和锁专题中介绍
  2. 如果发生意外而崩溃,无论当时数据库发生了什么,都不需要在重启数据库后执行任何特殊操作。InnoDB 的崩溃恢复功能会自动完成崩溃之前提交的更改,并撤消崩溃前正在进行但未提交的更改,从而允许我们从中断的地方继续执行。备份与恢复专题介绍
  3. 支持行级锁,提高了多用户的读取并发性和性能。事务和锁专题中介绍
  4. InnoDB 存储引擎维护了一个自己的缓冲池,访问数据时在内存中缓存表和索引数据,对于经常使用的数据直接从内存中处理,大幅提升了效率在专用数据库服务器上,通常会将高达 80%的物理内存分配给缓冲池
  5. InnoDB表优化了基于主键的查询,每个InnoDB表都有一个称为聚簇索引的主键索引,实现通过最少的磁盘I/0完成对主键的查找。索引专题中介绍
  6. 为了保持数据完整性,InnoDB 支持 FOREIGN KEY(外键)约束。在进行插入、更新和删除数据时确保相关表之间的一致性
  7. 从表中反复查询相同的行时自适应哈希索引会自动接管这些查询,此时查询效率和哈希表相同。

🏳️‍🌈三、InnoDB表的最佳实践

如何利用 InnoDB 的特性实现最佳的性能

  1. 为表中最频率查询的列(或多个列)指定主键(或复合主键),如果没有明显的主键,则创建一个自增的列做为主键。
  2. 从多个表中根据相同的ID查询数据,建议使用表连接。可以在连接的列上定义外键,并在每个表中使用相同的数据类型声明这些列。添加外键可以确保被引用的列 使用索引,从而提高性能
  3. 在每秒提交数百次事务的服务器上,结合存储设备的写入速度,关闭事务的自动提交,通过系统变量 autocommit=0FF 设置。
  4. 把相关的DML操作用 START TRANSACTION 和 COMMIT 语句括在一起,分组为事务一起提交或回滚。
  5. 不要使用 LOCK TABLES 语句,InnoDB可以在不牺牲可靠性和高性能的情况下处理多个会话同时对一个表进行读写操作。

🏳️‍🌈四、验证InnoDB是否为默认存储引擎

执行 SHOW ENGINES 语句查看可用的存储引擎时,查找 SUPPORT 列的值为 DEFAULT 的行

在这里插入图片描述

使用 SELECT * FROM INFORMATION_SCHEMA.ENGINES \G 查看当前 MySQL 服务器支持的存储引擎及其详细信息的命令

  • INFORMATION_SCHEMAMySQL 内置的系统数据库,存储了数据库、表、列等元数据信息。
  • ENGINES 是该数据库中的一张表,记录了 MySQL 服务器支持的所有存储引擎的详细信息。

在这里插入图片描述

如果InnoDB不是默认的存储引擎,可以通过在命令⾏指定选项 --default-storageengine=InnoDB
或者在选项⽂件的 [mysqld] 节点定义 default-storageengine=InnoDB重新启动服务器来设置 InnoDB 存储引擎

在这里插入图片描述

由于业务实际需要,服务器默认存储引擎不是InnoDB时想要创建一个InnoDB表,可以在使用 CREATE TABLE 语句创建表时明确指定 InnoDB 存储引擎,当然这样方式也可以指定其他任何支持的存储引擎

CREATE TABLE table_name (
	... 定义字段
) ENGINE = InnoDB; # 指定存储引擎

如果想测试使用其他存储引擎表中的数据在InnoDB表中的工作情况,在确保不影响原始表的情况下,使用以下方式创建一张InnoDB表

CREATE TABLE ... ENGINE=InnoDB AS SELECT * FROM other_engine_table;

🏳️‍🌈五、创建InnoDB表

# 选择⽬标数据库
use test_db
# 创建⼀个使⽤InnoDB存储引擎的表
CREATE TABLE t_innodb (
	id int(11) PRIMARY KEY AUTO_INCREMENT,
	name varchar(20)
) ENGINE = InnoDB;

当创建一个存储引擎为 InnoDb 的表时,会在 data_dir/test_db 目录下生成一个用来存储真实数据的物理文件,命名格式为 表名.ibd

以当前为例会在 /var/lib/mysql/test_db 目录下生成一个 t_innodb.ibd 的表空间数据文件

在这里插入图片描述

表空间文件 t_innodb.ibd 用来存储表中的数据

  • 在MySQL8.0中表结构的信息也保存在.ibd 文件中,可以使用 ibd2sdi 工具提取表定义的具体信息,使用方法: ibd2sdi --dump-file=t_innodb.txt t_innodb.ibd,生成的t_innodb.txt 文件中有对应表的具体描述
  • sid = Serialized DictionaryInformation 序列化字典信息
  • 和8.0有所不同的是,在MySOL5.X及以前的版本中使用一个后缀为 .frm 的二进制文件来记录和描述表定义的信息

在这里插入图片描述
这里面利用 json 格式的字符串保存了这个表的所有数据
在这里插入图片描述


👥总结

本篇博文对 【MySQL】存储引擎 - InnoDB详解 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~


网站公告

今日签到

点亮在社区的每一天
去签到