对面坐着仁爱的面试官
问:MyISAM 和 InnoDB 是两种引擎比较流行的储存引擎,你说说他们的区别吧?
核心区别
- MyISAM 是非事务安全型的,而 InnoDB 是事务安全型的。
- MyISAM 锁的粒度是表级,而 InnoDB 支持行级锁定。
- MyISAM 支持全文类型索引,而 InnoDB 不支持全文索引。
- MyISAM 相对简单,所以在效率上要优于 InnoDB,小型应用可以考虑使用 MyISAM。
- MyISAM 表是保存成文件的形式,在跨平台的数据转移中使用 MyISAM 存储会省去不少的麻烦。
- InnoDB 表比 MyISAM 表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景
- MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的 SELECT 查询,那么 MyISAM 是更好的选择。
- InnoDB 用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。如果应用中需要执行大量的 INSERT 或 UPDATE 操作,则应该使用 InnoDB,这样可以提高多用户并发操作的性能。
Mysql 的存储引擎和索引
- InnoDB 使用的是聚簇索引,将主键组织到一棵 B + 树中,而行数据就储存在叶子节点上,若使用 “where id = 14” 这样的条件查找主键,则按照 B + 树的检索算法即可查找到对应的叶节点,之后获得行数据。若对 Name 列进行条件搜索,则需要两个步骤:第一步在辅助索引 B + 树中检索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引 B + 树种再执行一次 B + 树检索操作,最终到达叶子节点即可获取整行数据。
- MyISM 使用的是非聚簇索引,非聚簇索引的两棵 B + 树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引 B + 树的节点存储了主键,辅助键索引 B + 树存储了辅助键。表数据存储在独立的地方,这两颗 B + 树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。
其他类型的引擎
- BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。
- Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
- Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
- Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
- Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
- Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。