MySQL存储引擎MyISAM和InnoDB的对比

MySQL5.1的默认存储引擎为MyISAM,从MySQL5.5版本开始,默认存储引擎改为InnoDB,MySQL5.6继承了MySQL5.5默认存储引擎InnoDB。

InnoDB和MyISAM是MySQL常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

以下是一些细节和具体实现的差别:

存储结构

MyISAM 每张表被存放在三个文件:
表名.frm-表格定义
表名.MYD(MYData)-数据文件
表名.MYI(MYIndex)-索引文件

InnoDB 所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

存储空间

MyISAM 可被压缩,存储空间较小

InnoDB 表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

锁定类型

锁定机制主要是为了防止多个处理同时更新同一个数据。不同的存储引擎支持不同级别的锁定:表锁定、页锁定和行锁定。
表锁定:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。支持最多的就是表锁定,MyISAM和MEMORY支持这种锁定。MySQL的表级锁有两种模式:表共享读锁和表独占写锁。对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
行锁定:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。InnoDB存储引擎支持行级锁定。
页锁定:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。BerkeleyDB引擎支持页锁定,根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。
综上,MyISAM采用表锁定,InnoDB采用行锁定,不过InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”。因而InnoDB存储引擎多用户并发的性能更强。

事务支持

MyISAM不支持事务,InnoDB支持事务。
事务是确保数据库一致的机制,尤其是在发生错误或服务器崩溃情况下确保一致的机制。事务是一个或一系列的查询,这些查询可以保证能够在数据库中作为一个整体全部执行或者全部不执行。这样,数据库才能在无论任务是否完成的情况下保持一致状态。

 表的具体行数
InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意,当count()语句包含 where条件时,两种表的操作是一样的。

全文索引

MyISAM支持全文索引,InnoDB不支持全文索引。

删除表

DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

索引

MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引。Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

InnoDB总结:

InnoDB 给 MySQL 提供了具有事务、回滚和崩溃修复能力的事务安全型表。InnoDB 提供了行锁,提供与 Oracle 类型一致的不加锁读取。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定,因为 InnoDB 的列锁定适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,可以拷贝文件或用navicat for mysql。

两种存储引擎的选择:

在大多数Web应用程序中,通常都会使用MyISAM或InnoDB表格或者二者的结合。
当对一个表格使用大量的Select或Insert语句(或者二者的结合)时,应该使用MyISAM
表格,因为在执行这两种命令时,MyISAM是最快的。对于许多Web应用程序(例如分类)来说,MyISAM是最佳选择。如果需要全文搜索功能,也应该使用MyISAM。当事务非常重要(例如存储财务数据的表格),或在Insert和Select语句是交错执行的情况下(例如在线论坛系统),应该使用InnoDB.

你可能感兴趣的:(Linux)