引擎 | InnoDB | MyISAM |
---|---|---|
事务 | 支持 | 不支持 |
最小锁粒度 | 行级锁 | 表级锁 |
外键 | 支持 | 不支持 |
压缩表 | 不支持 | 支持 |
空间索引 | 不支持 | 支持 |
实现B+树的区别 | 数据本身即为索引文件表数据文件本身就是按B+Tree组织的一个索引结构,树的节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,这被称为聚簇索引 或者聚集索引,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址 |
B+Tree叶节点的data域存放的是数据记录的地址,在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,这被称为非聚簇索引 |
使用选择
- 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB;
- 系统奔溃后,MyISAM恢复起来更困难,能接受就选 InnoDB;
InnoDB为什么推荐使用自增ID作为主键?
自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。
如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。