MyISAM InnoDB区别

来源:互联网 发布:思源网络教学支持 编辑:程序博客网 时间:2024/05/29 04:10
首先,简单的说,读多应该用MyISAM,写多可以用InnoDB
区别
1.MyISA在磁盘上有三个文件:.frm存储表定义 .MYD存储数据文件 .MYI存储索引为件
InnoDB:表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB

2.MyISAM不支持事务

3.执行大量的SELECT,MyISAM速度更快,如果执行大量的INSERT或者UPDATE,最好使用InnoDB。

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

5.MyISAM中AUTO_INCREMENT为内部处理,当INSERT时,自动更新这一列,而InnoDB保存了一个计数器,用来为该列赋值,该计数器被存储在主内存中:
---当一个用户对表T做插入之时,InnoDB执行等价如下语句的动作
SELECT MAX(ai_col) FROM T FOR UPDATE;
语句取回的值逐次加一,并被赋给列和自动增长计数器。如果表是空的,值1被赋予该列。如果自动增长计数器没有被初始化,而且用户调用为表T显示输出的SHOW TABLE STATUS语句,则计数器被初始化(但不是增加计数)并被存储以供随后的插入使用。在这个初始化中,我们对表做一个正常的独占读锁定,这个锁持续到事务的结束。

6.select count(*)from table ,MyISAM只需要简单读出保存好的行数,InnoDB需要扫描表,计算多少行

7.MyISAM表锁,InnoDB行锁,不过也不一定,如果执行一个语句不能确定扫描的范围,同样会锁定全表,例如update table set num=1 where name like “%aaa%”,或者对不是主键的where也会锁定全表。

8.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

9.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

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

11.MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

12.外键:MyISAM:不支持 InnoDB:支持
公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键
顺便说一下外键约束
1.级联(cascade)方式
insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符
delete from t_group where id=2; --导致t_user中的2、3记录级联删除
2.置空方式
删除的时候,导致t_user中的2、3记录的groupid被设置为NULL
3.禁止方式
删除的时候,错误,从表中有相关引用,因此主表中无法删除

13.MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:数据量大了,导出导入sql文件,比较痛苦


原创粉丝点击