MySQL架构和存储引擎<二>InnoDB和MyISAM存储引擎

目录

存储引擎

[InnoDB 存储引擎(重点)](#InnoDB 存储引擎(重点))

[MyISAM 存储引擎(重点)](#MyISAM 存储引擎(重点))

存储引擎

1.存储引擎是处理不同表类型SQL操作的MySQL组件。MySQL服务器采⽤可插拔的存储引擎架构, 在服务器运⾏时可以动态的加载和卸载
2.存储引擎层的作用为对数据进行处理,因此也是作为核心层而存在的

在存储引擎层对数据做处理时,就需要先考虑下面的一些问题

3.查看当前服务器⽀持哪些存储引擎可以使⽤ SHOW ENGINES 语句, Engine 表⽰:存储引擎的名称, Support :表⽰当前服务器是否⽀持,值分别为: YES 、 NO 和 DEFAULT 分别表⽰,⽀持、不⽀持和当前设置或默认引擎

InnoDB 存储引擎(重点)

InnoDB是⼀款兼顾⾼可靠性和⾼性能的通⽤存储引擎。在MySQL8.0中默认的存储引擎是 InnoDB ,使⽤ CREATE TABLE 语句创建表时,在没有修改默认存储引擎或明确指定其他存储引擎时,将创建⼀个 InnoDB 的表

1.InnoDB存储引擎的特性

2.InnoDB 的主要优势

(1)DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护⽤⼾数据。
(2)如果发⽣意外⽽崩溃,⽆论当时数据库发⽣了什么,都不需要在重启数据库后执⾏任何特殊操作。InnoDB 的崩溃恢复功能会⾃动完成崩溃之前提交的更改,并撤消崩溃前正在进⾏但未提交的更改,从⽽允许我们从中断的地⽅继续执⾏

(3)InnoDB 存储引擎维护了⼀个⾃⼰的缓冲池,访问数据时在内存中缓存表和索引数据,对于经常使⽤的数据直接从内存中处理,⼤幅提升了效率。在专⽤数据库服务器上,通常会将⾼达 80% 的物理内存分配给缓冲池。(sql语句为key,对应查询结果为value,以键值对的方式存储到内存中)
(4)InnoDB表优化了基于主键的查询,每个InnoDB表都有⼀个称为聚簇索引的主键索引,实现通过最少的磁盘I/O完成对主键的查找
(5)为了保持数据完整性, InnoDB ⽀持 FOREIGN KEY (外键)约束。在进⾏插⼊、更新和删除数据时确保相关表之间的⼀致性
(6)当从表中反复查询相同的⾏时,⾃适应哈希索引会⾃动接管这些查询,此时查询效率和哈希表相同。

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

(1)为表中最频率查询的列(或多个列)指定主键(或复合主键),如果没有明显的主键,则创建⼀个⾃增的列做为主键。

注:因此每张表最好指定一个主键,有了主键之后,就会用索引的方式把相关的每一行数据组织起来,在查询时就可以通过主键以最小的磁盘访问次数找到对应的数据,提高访问效率

(2)从多个表中根据相同的ID查询数据,建议使⽤表连接。可以在连接的列上定义外键,并在每个表中使⽤相同的数据类型声明这些列。添加外键可以确保被引⽤的列使⽤索引,从⽽提⾼性能

注:在做表连接时会生成一个笛卡尔积,把表数据进行各种组合来生成一个非常大的表。当表数据特别多时,相应的笛卡尔积的结果也会特别大,当进行查询时就会消耗很大的服务器资源来查找,因此需要使用索引来做优化

(3)在每秒提交数百次事务的服务器上,结合存储设备的写⼊速度,关闭事务的⾃动提交,通过系统变量 autocommit= OFF 设置,事务默认是自动提交的
(4)把相关的DML操作⽤ START TRANSACTION 和 COMMIT 语句括在⼀起,分组为事务⼀起提交或回滚。
(5)不要使⽤ LOCK TABLES 语句,InnoDB可以在不牺牲可靠性和⾼性能的情况下处理多个会话同时对⼀个表进⾏读写操作

4.验证InnoDB是否为默认存储引擎

(1)执⾏ SHOW ENGINES 语句查看可⽤的存储引擎时,查找 SUPPORT 列的值为 DEFAULT 的⾏

(2)查询Information Schema库中的ENGINES表

执行命令: SELECT * FROM INFORMATION_SCHEMA.ENGINES\G

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

打开 /etc/my.cnf文件进行配置

bash 复制代码
[mysqld] # 服务器节点下
default-storage-engine=InnoDB #明确指定InnoDB存储引擎

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

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

(5)如果想测试使⽤其他存储引擎表中的数据在InnoDB表中的⼯作情况,在确保不影响原始表的情况下,使⽤以下⽅式创建⼀张InnoDB表,命令如下:
CREATE TABLE ... ENGINE=InnoDB AS SELECT * FROM other_engine_table ;

5.创建InnoDB表

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

(1)当创建⼀个存储引擎为 InnoDB 的表时,会在 data_dir/test_db ⽬录下⽣成⼀个⽤来存储真实数据的物理⽂件,命名格式为 表名 .ibd ,以当前为例会在 /var/lib/mysql/test_db ⽬录下⽣成⼀个 t_innodb.ibd 的表空间数据⽂件

(2)在MySQL8.0中表结构的信息也保存在 .ibd ⽂件中,可以使⽤ ibd2sdi ⼯具提取表定义的具体信息,使⽤⽅法: ibd2sdi --dump-file=t_innodb.txt t_innodb.ibd,⽣成的
t_innodb.txt ⽂件中有对应表的具体描述
(3)sid = Serialized Dictionary Information 序列化字典信息

(4)和8.0有所不同的是,在MySQL5.X及以前的版本中使⽤⼀个后缀为 .frm 的⼆进制⽂件来记录和描述表定义的信息

MyISAM 存储引擎(重点)

MyISAM存储引擎是MySQL5.5之前默认的存储引擎

使⽤MyISAM存储引擎的表占⽤空间很⼩,但是由于使⽤表级锁定,所以限制了读/写操作的性能,通常⽤于中⼩型的Web应⽤和数据仓库配置中的只读或主要是读的场景

1.MyISAM 存储引擎的特性

与InnoDB存储引擎相比的话,区别在于

2.MyISAM 的主要优势
(1)MyISAM表的最⼤⾏数为 (2^32)^2 及 (1.844E+19) ⾏;
(2)每个MyISAM表最多可以创建64个索引,每个索引最多可以包含16个列;
(3)⽀持并发插⼊;
(4)通过 CREATE table 创建表时,指定 DATA DIRECTORY =PATH 和 INDEX
DIRECTORY =PATH 将数据⽂件和索引⽂件放在不同设备的不同⽬录中,从⽽提⾼访问速度;
(4)BLOB 和 TEXT 数据类型的列也可以被索引;
(5)在索引列中允许使⽤NULL值;
(6)如果mysqld启动时设置了 myisam_recover_options 系统变量,那么MyISAM表在打开时进⾏会⾃查,如果上⼀次表没有正确关闭将会修复;
(7)表中 VARCHAR 和 CHAR 列的⻓度总和最多可达64KB。
(8)UNIQUE 约束的⻓度不受限制

3.创建MyISAM 表

在MySQL 8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=MyISAM;

sql 复制代码
# 创建⼀个使⽤MyISAM存储引擎的表
CREATE TABLE t_myisam (
 id int(11) PRIMARY KEY AUTO_INCREMENT,
 name varchar(20)
) ENGINE = MyISAM;

创建 MyISAM 表会根据表名⽣成三个不同后缀名⽂件,分别是以 .MYD ( MYData )为后缀的数据⽂件,以 .MYI ( MYIndex ) 为后缀的索引⽂件,以 .sdi 为后缀的表信息描述⽂件(JSON格式)
注: 在8.0以前的版本中表信息描述⽂件是以.frm为后缀的⼆进制⽂件

4.MyISAM 表存储格式(数据在磁盘中的存储方式)

(1)MyISAM 表⽀持三种不同的存储格式,其中 FIXED 静态(固定)格式和 DYNAMIC 动态格式,根据使⽤的列类型⾃动选择,第三种是压缩格式,只能使⽤ myisampack 实⽤程序⽣成并且是只读格式。

(2)当表中没有 BLOB 或 TEXT 数据类型的列,在使⽤ CREATE TABLE 或 ALTER TABLE 语句创建或修改表时,可以结合 ROW_FORMAT 表选项将表格式设置为 FIXED 或 DYNAMIC
(3)使⽤ myisamchk 实⽤⼯具对已压缩的MyISAM进⾏解压操作, myisamchk --unpack

(1) 静态格式(Fixed-Length)表

(1)静态格式是 MyISAM 表的默认格式,当表不包含可变⻓度的列 ( VARCHAR, VARBINARY, BLOB 或 TEXT ) 时使⽤,每⾏都使⽤固定数量的字节存储
(2)MyISAM 的三种存储格式中,静态格式是最简单和最安全的(最不容易损坏),同时也是最快的磁盘格式,因为每⾏的⻓度固定,根据索引中的⾏号乘以⾏⻓度就可以计算出⾏位置,此外,每次读取固定数量的⾏也⾮常的⾼效。
(3)静态格式表具有以下特点:
1.CHAR 和 VARCHAR 类型的列⽤空格填充到指定的列宽; BINARY 和 VARBINARY 类 型的列⽤ 0x00 字节填充到列宽;
2.每个允许为NULL的列,都⽤⼀个 1 BIT 的额外空间记录当前列是否为空;
3.速度⾮常快,且易于缓存;
4.崩溃后易于重建,因为⾏都位于固定位置;
5.通常需要⽐动态格式表更多的磁盘空间;

(2)动态格式表
(1)当表中包含可变⻓度列( VARCHAR 、 VARBINARY 、 BLOB 或 TEXT )或者在创建表时使⽤ROW_FORMAT=DYNAMIC 选项,则表格式为动态存储格式
(2)动态格式表具有以下特点:
1.列类型是字符串,且⻓度⼤于等于4,⻓度都是动态的;
2.每⼀⾏都有⼀个标志来指⽰⾏有多⻓,当因更新操作⽽变得更⻓时,数据可能存储在 不连续的空间,可以使⽤ OPTIMIZE TABLE table_name 语句或 myisamchk -r 对表进 ⾏碎⽚整理;
3.每个允许为NULL的列,都⽤⼀个 1 BIT 的额外空间记录当前列是否为空;
4. 每⾏前⾯都有⼀个 bitmap (位图),⽤来记录包含空字符串或0的列,如果字符串类型 的列⻓度为零,或者数字列的值0,则在位图中标记并且不会保存到磁盘;
5.通常磁盘空间占⽤⽐固定⻓度表要少很多,行中存储的是真实数据的长度
6.每⾏都单独压缩,每列都可能⽤单独的⽅式进⾏压缩。

(3)常⽤的压缩⽅式:
1.如果数值列的值为0,⽆论原始数据类型是哪种都⽤⼀个 BIT 类型存储
2. 如果整数列中的值范围较⼩,则尽可能使⼩的类型存储该列,⽐如:列中的值范围在 -128
到 127 之间,即使原始类型为 bigint (8bytes),也使⽤ TINYINT (1 byte) 类型存储
3.如果列中只有⼀⼩组可能出现的值,则数据类型转换为 ENUM ;
(3)压缩格式表
(1)压缩存储格式是使⽤myisampack⼯具⽣成的只读格式数据表,压缩表可以⽤ myisamchk解压缩。
(2)压缩格式表具有以下特点:
1.压缩表占⽤很少的磁盘空间,最⼤限度地减少了磁盘使⽤;
2.可以⽤于固定⻓度或动态⻓度⾏
3.压缩表是只读的,因此不能在表中更新或添加数据;

相关推荐
爱吃火鸡面呀1 小时前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
知行产研1 小时前
中国矿山无人驾驶出海的三重门
数据库·mysql·php
爱和冰阔落2 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
Dxy12393102162 小时前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
wear工程师3 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
方便面不加香菜4 小时前
MySQL 复合查询
数据库·mysql
花花鱼4 小时前
MySQL Illegal mix of collations 全解|字符集与排序规则冲突原理、分层排错、通用解决方案(适配5.7/8.0迁移)
数据库·mysql
Lyyaoo.13 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
南城以南溫暖如初14715 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
冰之杍20 小时前
MySQL utf8mb3 → utf8mb4 完整修改方案
数据库·mysql