存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型。如果建表时没有指定存储引擎,则MySQL5.5版本之后默认为InnoDB
。
可以通过查询建表语句:show create table ***;(***为表名)
来查看这个表的存储引擎。
如:
在建表语句的最后会看到:
ENGINE=InnoDB
这个就是该表的存储引擎。AUTO_INCREMENT=43
表示:下一个申请的id为43;CHARSET=utf8mb4
表示字符集为默认的utf-8
;COLLATE=utf8mb4_0900_ai_ci
表示他的排序方式。
- 建表时指定存储引擎
CREATE TABLE 表名( …… ) ENGINE=InnoDB
- 查看当前数据库支持的存储引擎
SHOW ENGINES
Engine:存储引擎
Support:是否支持
Comment:注释
Transactions:是否支持事务
XA:是否支持XA协议
Savepoints:是否支持保存点
存储引擎特点
- InnoDB
介绍:
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。
特点:
- 支持DML操作遵循ACID模型,支持事务;(DML主要是增删改语句,ACID:十五的四大特性:原子性、隔离性、一致性、持久性)
- 行级锁,提高并发访问性能;
-
支持外键
FOREIGN KEY
约束,保证数据的完整性和正确性。文件:
xxx.idb
:xxx代表的是表名,innoDB
引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。(早期有一个文件叫frm
,在8.0之后表结构都存储在了sdi
这个数据字典)参数
innodb_file_per_table
决定到底是多张表共用一个共享表空间还说每一个表都对应一个表空间文件。(在MySQL8.0版本中这个开关是打开的,代表每一张表都对应一个表空间文件)可以使用
show variables like 'innodb_file_per_table'
命令查看该开关是否打开。用命令show variables like
可以进行模糊匹配查看系统的环境变量。
在
MySQL安装路径\data\数据库名
的文件夹里,会装着这个数据库下的表的空间文件。比如我的数据库为login
,有一张表user
。那么该文件夹里就是这样:
该文件记录了表结构、数据和索引。
.ibd
文件是二进制的,不能直接以技术本打开。可以通过cmd
指令:ibd2sdi 文件名
,例如:ibd2sdi user.ibd
查看。
-
MyISAM
介绍:
MyISAM是MySQL早期的默认存储引擎。
特点:
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
-
访问速度快
文件:
共有3个文件:
Xxx.MYD、Xxx.MYI、Xxx.sdi
-
Xxx.sdi
存储表结构信息,MyISAM
的sdi文件是一个文本文件,可以直接打开,里面存放的是JSON格式的数据。 Xxx.MYD
存储数据Xxx.MYI
存储索引
-
Memory
介绍:
Memory引擎的表数据是存储在内存中的,由于收到硬件问题、或断电问题的影响,这些数据会丢失,所以只能将这些表作为临时表或者缓存使用。
特点:
- 内存存放
-
hash索引(默认)
文件:
Xxx.sdi
:存储表结构信息因为Memory的数据是存储在内存中的,所以Memory的
Xxx.sdi
文件只存放表结构信息。
三个存储引擎的异同:
重点关注InnoDB
与MyISAM
的三大区别:
- InnoDB支持事务安全,MyISAM不支持事务安全。
- InnoDB 支持行锁,MyISAM只支持表锁。
- InnoDB支持外键,MyISAM不支持外键。
存储引擎的选择
存储引擎是没有好坏之分的,我们只需在合适的业务场景中选择合适的存储引擎即可。
InnoDB:
是MySQL的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
MyISAM:
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MEMORY:
将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
Innodb
的逻辑存储结构
Innodb
的逻辑存储结构分为表空间(TableSpace)、段(Segment)、区(Extent)、页(Page)、行(Row)。
在Innodb
的逻辑存储结构中:
- 页(Page)是磁盘操作的最小单元
- 一个区的大小是固定的:
1M
,这也意味着一个区可以包含64个页 - 一个页的大小也是固定的:
16k
在一个Row中会包含:
Trx id
最后一次操作失误的idRoll pointer
指针column
一个个的字段