InnoDB和MyISAM的区别

InnoDB和MyISAM的区别

 

1. 存储结构

MyISAM:索引和数据的文件分开存储,每个MyISAM在磁盘上存储成三个文件。

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

 

2. 存储空间

MyISAM:可以压缩,存储空间小。静态表、动态表、压缩表。

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

 

3. 可移植性,备份恢复

MyISAM:数据以文件形式存储,跨平台移植方便。

InnoDB:要将数据备份成.sql文件,数据量大的话就麻烦。

 

4. 事务支持

MyISAM:不支持事务,因为要求高性能,每个查询都是原子性,比InnoDB快。

InnoDB:支持事务、外键和崩溃恢复功能。

 

5. auto_incremant

 

6. 锁

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

InnoDB:行锁,大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。对索引加锁,而不是对数据加锁。

 

7. 全文索引

MyISAM:支持全文索引。

InnoDB:不支持全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

 

8. 主键

MyISAM:可以允许没有索引和主键,索引都是保存地址。

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

 

9. 表的具体行数

MyISAM:记录表的行数,select count(*) 时会直接取出记录。

InnoDB:不记录表的行数,select count(*) 时会遍历所有表。

 

10. 增删改查

MyISAM:如果执行大量的select,用MyISAM会更好。

InnoDB:如果大量insert、update,应考虑InnoDB;至于删除InnoDB也更好,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

 

11. 外键

MyISAM:不支持

InnoDB:支持

 

 

 

 

 

 参考:

http://www.jb51.net/article/62457.htm

 

 

 

 

猜你喜欢

转载自youyu4.iteye.com/blog/2333122