存储引擎
存储引擎
MySQL 中的数据用各种不同的技术存储在磁盘或内存中,这些技术会采用不同的存储机制、索引技巧、锁定水平,提供不同的功能和能力,提供这些技术能力的组件被称为存储引擎。通过选择不同的存储引擎,可以获得不同的速度或者功能,从而改善应用的整体功能。
MySQL 的存储引擎种类很多,例如 InnoDB,MyISAM,Memory 等,各存储引擎是以插件的形式运行。存储引擎是表维度的组件,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,MySQL 5.5.5 版本开始将 InnoDB 作为默认的存储引擎。
# 查看MySQL支持的所有存储引擎
show engines
# 查看表使用的存储引擎
SHOW CREATE TABLE table_name
InnoDB
Innodb的数据是存储在.ibd
文件中,每张表都会生成一个.ibd
文件,这个文件称为表空间。
在MySQL8.0之前,表结构信息(存储在
.fmt
文件中)和表存储的数据(存储在.ibd
文件中)是存放到不同的文件中,而8.0之后,表结构信息也已经融入到.ibd
文件中。
对于mac系统,MySQL的.ibd
文件存储在/usr/local/mysql/data
文件中,如果data文件无法打开,可以使用如下命令
sudo chmod -R a+rwx /usr/local/mysql/data
进入ibd文件所在目录,使用如下指令可以查看ibd文件的内容
# 查看表的ibd文件
ibd2sdi table_name.ibd
上面提到每张表都会生成自己独有的.ibd
文件,这个文件被称为独占表空间,除了独占表空间,InnoDB还提供了系统表空间,在系统表空间下,所有数据都存储在一个.ibd
文件中。
# 通过下面的命令查看表空间状态
SHOW VARIABLES LIKE 'innodb_file_per_table'
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
MyISAM
在MySQL 5.1及之前的版本,MylSAM是默认的存储引擎。MylSAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MylSAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
使用MyISAM作为存储引擎的表会生成三个文件,
.MYD:存储表的数据
.MYI:存储索引信息
.sdi:存储表结构信息
InnoDB和MyISAM的对比
InnoDB | MyISAM | |
---|---|---|
事务 | 支持 | 不支持 |
外键 | 支持 | 不支持 |
索引类型 | 聚集索引(B+树) | 非聚集索引(B+树) |
唯一索引 | 必须 | 非必须 |
全文索引 | 5.6以后支持 | 支持 |
锁级别 | 行锁、表锁 | 表锁 |
表的具体行数 | 不存储,使用count(*)查 | 存储 |
如何选择
1. 是否要支持事务,如果要就选择 InnoDB,如果不需要可以考虑MyISAM
2. 如果表中绝大多数都只是读操作或者插入操作,可以考虑 MyISAM,如果既有读也有写,使用 InnoDB
3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受
MyISAM 的优势已逐渐被 MongoDB 取代