两种常见数据库引擎:MyISAM 与 InnoDB 的区别

1.事务的支持

  • MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。

  • InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务 (commit)、回滚 (rollback) 和崩溃修复能力 (crash recovery capabilities) 的事务安全 (transaction-safe (ACID compliant)) 型表。

2.底层结构

  • InnoDB 是聚集索引,使用 B+Tree 作为索引结构数据文件是和(主键)索引绑在一起的(表数据文件本身就是按 B+Tree 组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。

  • MyISAM 是非聚集索引,也是使用 B+Tree 作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  • 也就是说:InnoDB 的 B + 树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而 MyISAM 的 B + 树主键索引和辅助索引的叶子节点都是数据文件的地址指针。

3.支持的锁级别

  • MyISAM:只支持表级锁,用户在操作 MyISAM 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。

  • InnoDB:支持事务和行级锁,是 innodb 的最大特色。行锁大幅度提高了多用户并发操作的新能。但是 InnoDB 的行锁,只是在 WHERE 的主键是有效的,非主键的 WHERE 都会锁全表的

4.其他

  • InnoDB 支持外键,而 MyISAM 不支持。
  • Innodb 不支持全文索引,而 MyISAM 支持全文索引,在涉及全文索引领域的查询效率上 MyISAM 速度更快高;PS:5.7 以后的 InnoDB 支持全文索引了

5.应用场景

  • MyISAM 适合查询以及插入为主的应用。如果你的应用程序对查询性能要求较高,就要使用 MyISAM 了。MyISAM 的性能更优,占用的存储空间少

  • InnoDB 适合频繁修改以及涉及到安全性较高的应用。如果你的应用程序一定要使用事务,毫无疑问你要选择 INNODB 引擎。但要注意,INNODB 的行级锁是有条件的。在 where 条件没有使用主键时,照样会锁全表。比如 DELETE FROM mytable 这样的删除语句。

现在一般都是选用 innodb 了,主要是 MyISAM 的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM 对于读写密集型应用一般是不会去选用的。

补充:

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

  • 聚簇索引的底层数据结构是B+数, B + 的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对 B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。数据存放的更加紧密,具有更好的空间局部性。一次性读入内存中的需要查找的关键字也就越多。同理,自增主键也要比其他主键的内容更少,存放的内容当然也更多。因此访问叶子节点上关联的数据也具有更好的缓存命中率。相对来说 IO 读写次数也就降低了。

  • 自增 ID 可以保证每次插入时 B + 索引是从右边扩展的,可以避免 B + 树和频繁合并和分裂(对比使用 UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。


【Java 面试那点事】

这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!

这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】

面试路上,你不孤单!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章