为什么是InnoDB

InnoDB和MyISAM的区别

索引

InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高,但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据.因此,主键不应该过大,否则其他索引也会很大.而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的.

事务

InnoDB 支持事务功能,对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin 和 commit 之间,组成一个事务.
MyISAM 不支持,也因此执行速度更快,性能更好.

锁机制

InnoDB 为行级锁,myisam 为表级锁.
注意:当数据库无法确定,所找的行时,也会变为锁定整个表.
如:

1
update table set num = 10 where username like "%test%";

MVCC (Multi-Version Concurrency Control)

阿里数据库内核‘2017/12’月报中对MVCC的解释是:
多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度.在内部实现中,与Postgres在数据行上实现多版本不同,InnoDB是在undolog中实现的,通过undolog可以找回数据的历史版本.找回的数据历史版本可以提供给用户读(按照隔离级别的定义,有些读请求只能看到比较老的数据版本),也可以在回滚的时候覆盖数据页上的数据.在InnoDB内部中,会记录一个全局的活跃读写事务数组,其主要用来判断事务的可见性.

<高性能MySQL>中对MVCC的部分介绍

  • MySQL的大多数事务型存储引擎实现的其实都不是简单的行级锁.基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC).不仅是MySQL,包括Oracle,PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准.
  • 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低.虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行.
  • MVCC的实现方式有多种,典型的有乐观(optimistic)并发控制 和 悲观(pessimistic)并发控制.
  • MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作.其他两个隔离级别够和MVCC不兼容,因为 READ UNCOMMITTED 总是读取最新的数据行,而不是符合当前事务版本的数据行.而 SERIALIZABLE 则会对所有读取的行都加锁.

实现

根据Mysql官方文档,可以看到,InnoDB存储引擎在数据库每行数据的后面添加了三个字段来实现MVCC,网上流传的两个字段是错的!

外键

InnoDB 支持外键,而 MyISAM 不支持.对一个包含外键的 InnoDB 表转为 MYISAM 会失败.

表行数

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描.而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快,但如果上述语句还包含了 where 子句,那么两者执行效率是一样的.

选择InnoDB还是MyISAM的场景

两种存储引擎的选择,要结合你的业务场景来做选型,可以参考以下基本原则:

  1. 是否要支持事务,如果要请选择 Innodb,如果不需要可以考虑 MyISAM。
  2. 如果表中绝大多数都是读查询(有人总结出 读:写比率大于100:1),可以考虑 MyISAM,如果既有读又有写,而且也挺频繁,请使用 InnoDB。
  3. 系统崩溃后,MyISAM 恢复起来更困难,能否接受。
  4. MySQL 5.5 开始 InnoDB 已经成为 MySQL 的默认引擎(之前是 MyISAM ),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB吧,至少不会差。

引用

https://juejin.im/post/5c43ee36518825254b5a3c3a
https://segmentfault.com/a/1190000012650596
https://blog.csdn.net/u011114896/article/details/38580389

多谢支持