MYSQL中的MyISAM与InnoDB存储引擎区别整理

一.介绍

MySQL 是最流行的关系型数据库管理系统,结构如下:

在这里插入图片描述
这个图简略的表示了Mysql的体系结构,其中mysql的存储引擎面试经常问,所以下面整理一下


二.对比

1.表锁和行锁

Innodb支持行级锁和表级锁,这是最大的不同,MyISAM只支持表级锁。 随着CPU核数的增加,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。


2.是否支持事务

Innodb支持事务,MyISAM不支持事务。MyISAM是一种非事务性的引擎,使得MyISAM引擎的MySQL可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。

  • InnoDB是事务安全的;事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

3.结构上的区别

(1)每个MyISAM在磁盘上存储成三个文件:

  • 第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。
  • 第二个文件是数据文件,其扩展名为.MYD (MYData)。
  • 第三个文件是索引文件,其扩展名是.MYI (MYIndex)。

(2)基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB。


4.关于count(*)

InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。

 注意,当count(*)语句包含where条件时,两种表的操作是一样的。
5.并发控制

Innodb支持MVCC机制,也就是多并发版本控制,提供提交、回滚、崩溃恢复能力的事务安全(ACID)能力,实现并发控制。

6.索引区别

MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据。
在这里插入图片描述
Innodb也是用B+树来构造索引, 区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引。

  • 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据也就是数据行和相邻的键值紧凑地存储在一起。
    在这里插入图片描述
  • 辅助索引(不用主键查询):InnoDB对辅助索引采取的方式是在叶子页中保存主键值,通过这个主键值来回表查询到一条完整记录,所以按辅助索引检索实际上进行了二次查询,效率肯定是没有按照主键检索高的。下图是辅助索引的实现方式:
    在这里插入图片描述

三.如何选择

MyISAM适合:

  • 做很多count 的计算;
  • 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
  • 没有事务。

InnoDB适合:

  • 可靠性要求比较高,或者要求事务;
  • 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
  • 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;
  • DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;
  • LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

四.总结

1).MyISAM存储引擎的特点是:表级锁、不支持事务和支持全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;

2).InnoDB存储引擎的特点是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。

上一张图:
在这里插入图片描述


五.补充

MyISAM采用非聚簇索引的好处:数据存放位置固定,集中管理,假如有索引是(a,b,c),那么如果根据b,c这种非主键来查询效率更高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyISAMInnoDBMySQL常用的两种存储引擎,它们在功能和性能上有一些区别。 1. 事务支持:InnoDB支持事务处理,而MyISAM不支持。事务是一组操作的原子单位,可以保证数据的一致性和完整性。如果你需要使用事务来控制并发访问或者实现数据回滚等功能,那么InnoDB是更好的选择。 2. 锁级别:MyISAM使用表级锁定,而InnoDB支持行级锁定。表级锁定意味着当一个线程对表进行修改时,其他线程无法对同一表进行修改。而行级锁定允许多个线程同时修改表的不同行,提高了并发性能。 3. 外键支持:InnoDB支持外键约束,而MyISAM不支持。外键是用来定义表与表之间的关系的约束条件,可以保证数据的一致性和完整性。如果你需要在数据库层面实现数据完整性的控制和关联查询等功能,那么InnoDB是更好的选择。 4. 崩溃恢复:InnoDB具有崩溃恢复的能力,可以在数据库发生故障或者断电等情况下恢复数据的一致性。而MyISAM不具备这种能力,可能会导致数据丢失或者损坏。 5. 全文索引:MyISAM支持全文索引,而InnoDBMySQL 5.6版本之前不支持全文索引。全文索引可以提高对文本内容的搜索效率。 综上所述,如果你需要事务支持、并发性能较高、数据完整性控制和崩溃恢复等特性,那么InnoDB是更好的选择。如果你主要进行读操作,并且对于事务和数据完整性要求不高,那么MyISAM可能是一个更简单和高效的选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值