一、MYSQL系统默认的存储引擎
在MYSQL5.5以后默认采用InnoDB,之前采用MyISAM。
我们可以用
show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;
来查看系统默认的存储引擎:
如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改 my.cnf 文件:
default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service
二、具体介绍
2.1 InnoDB 引擎:具备外键
支持功能的事务存储引擎
- InnoDB是MySQL的 默认
事务型引擎
,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback); - 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎;
- 数据文件结构:
- 表名.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)
- 表名.ibd 存储数据和索引
- InnoDB是 为处理巨大数据量的最大性能设计 。因为它支持行锁,适用于处理
高并发
操作; - InnoDB不仅
缓存索引还要缓存真实数据
, 对内存要求较 高 ,而且内存大小对性能有决定性的影响; - 对比MyISAM的存储引擎, InnoDB写的处理
效率差一些
,并且会占用更多的磁盘空间
以保存数据和索引;
2.2 MyISAM 引擎:主要的非事务处理存储引擎
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持
事务、行级、锁、外键
,有一个毫无疑问的缺陷就是崩溃后无法安全恢复 ; - 优势是访问的速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用 ;
- 针对数据统计有
额外的常数存储
,故count(*)查询效率较高; - 数据文件结构: (数据和索引分开存储)
- 表名.frm 存储表结构
- 表名.MYD 存储数据 (MYData)
- 表名.MYI 存储索引 (MYIndex)
- 应用场景:只读应用或者以读为主的业务
2.3 InnoDB vs. MyISAM
对于InnoDB,它提供了良好的事务管理、崩溃修复能力和并发控制。因为它支持事务,所以对于要求事务完整性的场合需要选择InnoDB,比如数据要频繁更新、删除,对数据准确性要求高的场合等。
缺点是读写效率差
、占用的数据空间相对较大
。
对于MyISAM,如果是小型应用,系统以读操作和插入为主,可以选择。
优势在于占用空间小、处理速度快
;缺点就是不支持事务,崩溃后无法安全恢复 。
下面通过一个表格来展示:
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | × | √ |
事务 | × | √ |
锁机制 | 表锁,不适合高并发操作 | 行锁,操作只针对一行,适合高并发 |
缓存 | 只缓存索引,不缓存数据 | 不仅缓存索引还要缓存真实数据 |
空间使用 | 低 | 高 |
索引 | 非聚簇索引,索引文件的数据域存储指向数据文件的指针 | 聚簇索引,主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值; |