| 对比项 | MyISAM | InnoDB |
| 外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 行表锁 | 表锁,不适合高并发 | 行锁,适合高并发 |
| 缓存 | 之缓存索引,不缓存真实数据 | 不仅缓存索引而且缓存真实数据,内存大小对性能影响大 |
| 关注 | 节省资源,消耗少,业务简单 | 并发写,事务,更大资源 |
| 默认 | 系统自带表使用 | 自建表默认使用 |
MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”,而其余的索引都作为辅助索引,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
本文深入解析了InnoDB和MyISAM两种数据库引擎在外键支持、事务处理、锁机制、缓存策略和资源需求上的差异,帮助开发者根据业务场景决定最佳选择。
191

被折叠的 条评论
为什么被折叠?



