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