MyISAM 和InnoDB 区别


 

MyISAM和InnoDB

MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。

大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的,比如读密集的情况下。(如果你不介意 MyISAM 崩溃恢复问题的话)。
 
 

MyISAM和InnoDB对比

1. 是否支持行级锁

MyISAM 只有表级锁(table-level locking)。

InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

2. 是否支持事务和崩溃后的安全恢复

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

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

3. 是否支持外键

MyISAM不支持

InnoDB支持

4. 是否支持MVCC

仅 InnoDB 支持。应对高并发事务

补充

MVCC:是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要堵塞。在引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。

 
 

索引方式对比

MySQL索引使用的数据结构主要有BTree索引和哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。

MyISAM和InnoDB不支持哈希索引,BTree索引使用的是B树中的B+Tree,但MyISAM和InnoDB对其的实现方式是不同的。

MyISAM

B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录,也就是说其索引文件和数据文件是分离的。MyISAM的这种索引方式被称为“非聚簇索引”。

InnoDB

其数据文件本身就是索引文件,相比MyISAM,索引文件和数据文件是分离的,InnoDB的表数据文件是按B+Tree组成的一个索引结构,树的叶节点data域保存了完整的数据记录,其索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引“。而其余的索引都作为辅助索引,辅助索引的data域存储的是主键的值而不是地址。在根据主索引搜索时,直接找到key所在的节点即可在叶节点中取出数据。在根据辅助索引查找时,则需要先取出主键的值,再进行一遍主索引搜索。

 
 
参考:
https://github.com/Snailclimb/JavaGuide

猜你喜欢

转载自blog.csdn.net/weixin_43901865/article/details/112724717