一、先了解一下InnoDB与MyISAM分别是什么,又因何诞生
- InnoDB是集聚引擎。它设计之初就是为了处理大量数据时提供高性能的服务,因此在运行时会在内存中建立缓冲池,用于缓冲数据和索引。
- MyISAM是非集聚引擎。它设计之初就是为了快速读取。
二、InnoDB与MyISAM的区别
我们通过上述知道,InnoDB设计之初就是处理大量数据时提供高性能的服务。那么大量数据处理过程中,我们肯定会一些问题:
- 事务问题:在大规模数据中,就意味着有可能大规模的修改,遇到事务问题也是很常见,因此肯定会添加事务相关的操作(事务ACID特性、SQL隔离级别等)
- 锁表问题:有时候我们修改表中的数据,为了确保原子性操作,往往锁住一整张表。如果改表里的一行数据就要锁住该表,这对性能来说,是不太友好的,因此需要细化锁,因此,也需要添加行锁的支持。
- 关联表问题:当大数据量的时候,会将不同的信息放在不同的表。有时为了获取完整的信息,会进行关联表的操作,使用外键能大大增加其性能。
- 拷贝问题:这个不用多说,肯定要支持跨平台拷贝。
- 数据恢复问题:这么多数据,如果一旦丢失找不回来,这可是最忌讳的,因此,也必须要有能恢复数据的方法。
- 统计表中有多少行数问题:在这种结构下,他就是会频繁的写数据以及改数据,保存表中有多少行数据显示不符合设计理念。(因为它没有保存表的行数,当使用COUNT统计时会扫描全表)
那我们再来看看MyISAM,其设计之初就只考虑快速读取。因此我们想想,为了快速读取,我们会抛弃哪些功能或者增强哪些功能?
- 事务功能:如果仅仅是为了快速读取,那么就不怎么需要事务了,事务大概率是要加锁阻塞的
- 行锁及外键功能:前面说了仅仅为了快速读取,不怎么考虑插入、更新问题、甚至连关联表问题都没有考虑,因此锁是没有细化的(还是表锁),外键也是没有的。(比如:INSERT和UPDATE操作需要锁定整个表)
- 数据恢复功能:就是为了频繁读取设计,还考虑个毛数据恢复啊,又不是频繁写。
- 拷贝功能:MyISAM设计的结构很难进行跨平台拷贝。
- 统计表中有多少行数功能:读取也是经常要读取表中有多少行,因此也是会具备的。(因为它保存了表的行数,当使用COUNT统计时不会扫描全表)
因此,我们知道InnoDB与MyISAM的区别
特性 | InnoDB | MyISAM |
索引类型 | 聚簇索引(主键索引即数据文件) | 非聚簇索引(索引与数据分离) |
主键索引叶子节点 | 存储完整数据行 | 存储数据行的物理地址 |
辅助索引叶子节点 | 存储主键值(需回表查询) | 存储数据行的物理地址 |
事务支持 | 支持 ACID 事务 | 不支持事务 |
锁粒度 | 行级锁(默认) | 表级锁 |
外键支持 | 支持外键 | 不支持外键 |
崩溃恢复 | 通过 redo log 和 undo log 保障 | 无日志,依赖文件系统恢复 |
全文索引 | MySQL 5.6+ 支持全文索引 | 原生支持全文索引(但性能较低) |
适用场景 | 高并发写入、事务性操作 | 只读或读多写少的场景 |
三、InnoDB与MyISAM的使用场景
InnoDB | MyISAM | |
使用场景 | 1.系统读少,写多的时候,尤其是并发写⼊⾼的时候 2.需要事务的操作 3.更新数据需要使用行级锁 4.大数据量读写 | 1.系统读多,写少,对原⼦子性要求低 2.不需要事务的操作 3.插入、更新少,读取频繁 4.频繁的统计计算 |
备注:
-
mysql默认引擎:mysql-5.1版本之前默认引擎是MyISAM,之后是innoDB。
-
DELETE 表时,InnoDB引擎是一行一行的删除,MyISAM是先drop表然后重建表。
-
因为MyISAM相对简单所以在效率上要优于InnoDB
-
MyISAM恢复速度快,可直接⽤用备份覆盖恢复
更多内容: