MySQL 存储引擎InnoDB最佳实践

 更新时间:2025年05月09日 10:24:04   作者:JhonKI  
InnoDB是一款兼顾高可靠性和高性能的通用存储引擎,在MySQL8.0中默认的存储引擎是InnoDB,这篇文章主要介绍了MySQL存储引擎InnoDB详解,需要的朋友可以参考下

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

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

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

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

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

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

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

  • 为表中最频率查询的列(或多个列)指定主键(或复合主键),如果没有明显的主键,则创建一个自增的列做为主键。
  • 从多个表中根据相同的ID查询数据,建议使用表连接。可以在连接的列上定义外键,并在每个表中使用相同的数据类型声明这些列。添加外键可以确保被引用的列 使用索引,从而提高性能。
  • 在每秒提交数百次事务的服务器上,结合存储设备的写入速度,关闭事务的自动提交,通过系统变量 autocommit=0FF 设置。
  • 把相关的DML操作用 START TRANSACTION 和 COMMIT 语句括在一起,分组为事务一起提交或回滚。
  • 不要使用 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详解 做了一个较为详细的介绍,不知道对你有没有帮助呢

到此这篇关于MySQL 存储引擎InnoDB详解的文章就介绍到这了,更多相关MySQL 存储引擎InnoDB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Centos中安装多个mysql数据的配置实例

    Centos中安装多个mysql数据的配置实例

    最近因为单位项目扩充,需要在原线上数据库服务器上加装一个mysql实例(实际上就是从新编译安装一个非3306的自定义端口,不同目录的mysql),研究了一天,终于顺利搞定,这里把配置步骤发给大家,供大家学习使用
    2014-04-04
  • 一文详解MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)

    一文详解MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Co

    MVCC是一种用于数据库管理系统的并发控制技术,允许多个事务同时访问数据库,而不会导致读写冲突,本文就详细的介绍了MVCC的具体用法,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Mysql CAST函数的具体使用

    Mysql CAST函数的具体使用

    本文主要介绍了Mysql CAST函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • MySQL字符串转数字的3种方式实例

    MySQL字符串转数字的3种方式实例

    这篇文章主要给大家介绍了关于MySQL字符串转数字的3种方式,在使用mysql中经常遇到要将字符串数字转换成可计算数字,文中给出了详细的代码示例和图文介绍,需要的朋友可以参考下
    2023-08-08
  • mysql 8.0.12 安装图文教程

    mysql 8.0.12 安装图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.12 安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 关于TIMESTAMP with implicit DEFAULT value is deprecated 错误解决方法

    关于TIMESTAMP with implicit DEFAULT value&

    本文介绍了“TIMESTAMP with implicit DEFAULT value is deprecated”错误的原因及解决方法,解决方法包括显式指定默认值、修改字段类型、更新数据库版本或寻求帮助,感兴趣的朋友一起看看吧
    2025-02-02
  • 解决windows service 2012阿里云服务器在搭建mysql时缺少msvcr100.dll文件的问题

    解决windows service 2012阿里云服务器在搭建mysql时缺少msvcr100.dll文件的问题

    这篇文章主要介绍了解决windows service 2012阿里云服务器在搭建mysql时缺少msvcr100.dll文件的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • MySQL使用TEXT/BLOB类型的知识点详解

    MySQL使用TEXT/BLOB类型的知识点详解

    在本篇文章里小编给大家整理的是关于MySQL使用TEXT/BLOB类型的几点注意内容,有兴趣的朋友们学习下。
    2020-03-03
  • MySQL DATEDIFF函数获取两个日期的时间间隔的方法

    MySQL DATEDIFF函数获取两个日期的时间间隔的方法

    这篇文章主要介绍了MySQL DATEDIFF函数获取两个日期的时间间隔的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • JDBC如何连接mysql

    JDBC如何连接mysql

    这篇文章主要介绍了JDBC如何连接mysql问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论