存储引擎

存储引擎

MySQL 中的数据用各种不同的技术存储在磁盘或内存中,这些技术会采用不同的存储机制、索引技巧、锁定水平,提供不同的功能和能力,提供这些技术能力的组件被称为存储引擎。通过选择不同的存储引擎,可以获得不同的速度或者功能,从而改善应用的整体功能。

MySQL 的存储引擎种类很多,例如 InnoDB,MyISAM,Memory 等,各存储引擎是以插件的形式运行。存储引擎是表维度的组件,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,MySQL 5.5.5 版本开始将 InnoDB 作为默认的存储引擎。

# 查看MySQL支持的所有存储引擎
show engines
# 查看表使用的存储引擎
SHOW CREATE TABLE table_name

image

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 取代

posted @ 2023-05-26 14:13  路半_知风  阅读(11)  评论(0编辑  收藏  举报