MyISAM 和 InnoDB 的区别和优缺点
区别 | MyISAM | InnoDB |
---|---|---|
事务 | 不支持 | 支持 |
存储结构 | 每个MyISAM在磁盘上存储成三个文件 | 所有的表都保存在同一个数据文件中 |
存储空间 | 可被压缩,存储空间较小 | 会在主内存中建立其专用的缓冲池(需要更多内存和存储) |
可移植性 | 跨平台的数据转移中会很方便,在备份和恢复时可单独针对某个表进行操作 | 拷贝数据文件、备份 binlog,或者用 mysqldump |
事务支持 | 每次查询具有原子性,但不支持事务 | 提供事务支持事务 |
表锁差异 | 只支持表级锁 | 支持行级锁 |
全文索引 | 支持 | 不支持 |
表主键 | 允许没有任何索引和主键的表存在 | 如果未设置主键,会自动生成 |
表总行数 | 保存有 | 没有保存 |
CURD | 对于select支持更好 | INSERT/DELETE支持更好 |
外键 | 不支持 | 支持 |
查询效率 | 小型应用可以考虑使用 | 高并发、复杂情况表现更优 |
1.1 MyISAM和InnoDB简介
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。
不过,5.5版本之后,MySQL引入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。
现在大多数时候我们使用的都是InnoDB存储引擎,但是在某些情况下使用MyISAM更好,比如:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎(最后一句有待验证,因为主库负责对外提供写服务,从库对外提供读服务)。
1.2 MyISAM特点
- 不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁;
- 不支持事务
- 不支持外键
- 不支持崩溃后的安全恢复
- 在表有读取查询的同时,支持往表中插入新纪录
- 支持BLOB和TEXT的前500个字符索引,支持全文索引
- 支持延迟更新索引,极大地提升了写入性能
- 对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用
补充概念:Mysql的行锁和表锁( 锁是计算机协调多个进程或纯线程并发访问某一资源的机制)
表级锁: 每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁: 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
1.3 InnoDB特点
- 支持行锁,采用MVCC来支持高并发,有可能死锁
- 支持事务
- 支持外键
- 支持崩溃后的安全恢复
- 不支持全文索引
1.4 MyISAM和InnoDB两者的应用场景:
- MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
- InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。