目前 MySQL 的数据库引擎一般使用 InnoDB 和 MyISAM,但两者存在一些差别。网上零零散散的文章看起来比较麻烦,这里以表格汇总对比二者区别。如有纰漏,还望读者在评论区指正。
InnoDB | MyISAM | |
---|---|---|
MySQL 默认引擎 | ✅ | ❌ |
事务 | ✅ | ❌ |
并发 | 表级锁 ✅ 行级锁 ✅,采用 MVCC 来支持高并发,有可能死锁 |
表级锁 ✅ 行级锁 ❌ |
外键 | ✅ | ❌ |
在线热备份 | ✅ | ❌ |
COUNT (*) | 无 meta-data 缓存,查全表获取 | 有 meta-data 缓存,直接获取 |
崩溃恢复 | 通过事务日志来恢复数据库 | 损坏率高,恢复速度慢,不能安全恢复 |
其他 | 默认隔离级别是可重复读(REPEATABLE READ),通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读 | 设计简单,数据以紧密格式存储 |
索引特性 | 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。 | DELAY_KEY_WRITE 选项:修改后,新索引数据写入内存中的键缓冲区,清理键缓冲区或者关闭表时才写入磁盘。极大提升写入性能,但崩溃时会造成索引损坏 |
全文索引 | >= MySQL 5.6.4 ✅ < MySQL 5.6.4 ❌ |
✅ 支持 BLOB 和 TEXT 的前 500 个字符索引 |
自有特性 | 内部优化: 1. 可预测性读加快读操作 2. 自适应哈希索引加速插入操作的插入缓冲区 |
1. 支持压缩表和空间数据索引 2.并发插入(CONCURRENT INSERT):在表有读取操作的同时,也可以往表中插入新的记录 |
参考链接: 技术面试必备基础知识:MySQL MyISAM 与 InnoDB 区别 MySQL 常见的两种存储引擎:MyISAM 与 InnoDB 的爱恨情仇