Blogger Information
Blog 42
fans 3
comment 2
visits 93626
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
MySQL存储引擎MyISAM与InnoDB区别
Whitney的博客
Original
1356 people have browsed it
MySQL存储引擎MyISAM与InnoDB区别

1、MySql默认存储引擎的变迁

在MySql5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL5.5之后的版本中,默认的搜索引擎变更为InnoDB。

2、存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

               .frm文件存储表定义;

               数据文件的扩展名为.MYD(MYData);

               索引文件的扩展名是.MYI(MYIndex);

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

3、存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

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

4、可移植性、备份与恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者使用mysqldump,在数据量达到几十G的时候就相对痛苦了。

5、事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行速度相比InnoDB较快,但是不提供事务支持

InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务提交(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe(ACID compliant))型表。

6、AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

7、表锁差异

MyISAM:只支持表级锁,用户在操作MyISAM表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是InnoDB的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在where的主键是有效的,非主键的where都会锁全表的。

8、全文索引

MyISAM:支持FULLTEXT类型的全文索引

InnoDB:不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果很好。

9、表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

10、表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出该值。

InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整张表,消耗相当大,但是在家了where条件后,MyISAM和InnoDB的处理方式都一样。

11、CURD操作

MyISAM:如果执行大量的select,MyISAM是更好的选择。

InnoDB:如果执行大量的insert或者update操作,出于性能方面的考虑,应该使用InnoDB表。delete从性能上InnoDB更优,但delete from table时,InnoDB不会重新建立表,而是一行一行的删除,在InnoDB上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

12、外键

MyISAM:不支持

InnoDB:支持

13、总结:

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

14、存储引擎选择的基本原则

采用MyISAM引擎:

R/W > 100:1 且update相对较少

并发不高

表数据量小

硬件资源有限

采用InnoDB引擎

R/W比较小,频繁更新大字段

表数据量超过千万级,并发高

安全性和可用性要求高

采用Memory引擎

有足够的内存

对数据一致性要求不高,如在线人数和session应用等等

需要定期归档数据

参考链接:

https://segmentfault.com/a/1190000008227211

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post