MySQL-InnoDB与MyISAM的区别

引擎 InnoDB MyISAM
事务 支持 不支持
最小锁粒度 行级锁 表级锁
外键 支持 不支持
压缩表 不支持 支持
空间索引 不支持 支持
实现B+树的区别 数据本身即为索引文件表数据文件本身就是按B+Tree组织的一个索引结构,树的节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,这被称为聚簇索引或者聚集索引,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址 B+Tree叶节点的data域存放的是数据记录的地址,在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,这被称为非聚簇索引

使用选择

  1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
  2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB;
  3. 系统奔溃后,MyISAM恢复起来更困难,能接受就选 InnoDB;

InnoDB为什么推荐使用自增ID作为主键?

自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。

如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。