数据库两种存储引擎MyISAM和InnoDB 的区别

MyISAM 和 InnoDB的区别

概述:在MySQL5.5之前的版本中的默认的数据库的存储的引擎为MyISAM,虽然MyISAM的性能很好,但是它的缺点是不支持事务,后来被InnoDB所取代。
我用的是mysql 5.5安装版本的默认的是InnoDB, 网上说的免安装版本的5.5是MyISAM

(1)事务

MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

(2)存储结构

MyISAM的物理的存储的结构:
.frm 存储的是表的定义
.myd 存储的是表的数据
.myi 存储的是表的索引
InnoDB的物理的存储的结构:
独享表:
.frm 存储的是表的定义
.ibd 存储的是独享表的数据
共享表:
.ibdata 存储的是共享表的数据

(3)存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

(4)数据的备份与恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

(5)事务的支持

MyISAM的查询的操作是原子性的,但是对事务是不支持的,执行的速度是比InnoDB更快的
InnoDB:支持事务外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

(6)自动增长

MyISAM对于自增长规定必须是索引,如果是联合索引的话,那么这个自增的列可以不在第一列
InnoDB的自动的增长列必须是索引,如果是联合索引的话,自增的列也必须是在第一列。

(7)表锁的差距

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

MyISAM锁的粒度是表级,而InnoDB支持行级锁定。简单来说就是, InnoDB支持数据行锁定,而MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

(8)全文的索引

InnoDB不支持全文索引(sphinx插件可以支持全文索引,效果更好),MyISAM支持全文的索引

(9)表的主键

InnoDB:如果表中的主键和索引为空的话,会自己产生一个隐藏的6个字节的主键
MyISAM:可以在表中没有任何的主键和索引

(10)表的具体的行数

MyISAM:存入有表中的具体的行数
InnoDB中没有存储表的具体的行数,查询的时候要对整个表进行遍历,消耗巨大。

(11) CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

(12)外键

MyISAM不支持外键,InnoDB支持外键。

(13)查询效率

没有where的count()使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌

发布了171 篇原创文章 · 获赞 386 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/102799479