在该开始学习mysql建立表时,发现了mysql中的的MyISAM和InnoDB两种表类型,于是在网上查找了各种解释,进行了一下总结。

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

MyISAM:这是一个默认类型,它基于传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,它是存储记录和文件的标准方法。与其他存储引擎相比,MyISAM具有检查和修复表格的多大数工具,MyISAM表格可以被压缩,而且它们支持全文搜索,它们不是事务安全的,而且也不支持外键。如果事务回滚就造成不完全回滚,不具有原子性。如果执行大量的select,MyISAM是更好的选择。

InnoDB:这种类型是事务安全的,它与BDB类型具有相同的特性,他们还支持外键,InnoDB表格的速度很快,具有比BDB 还丰富的特行,因此如果需要一个事务安全的存储引擎,就可以使用它,如果你的数据执行大量的INSERT或UPDATE,处于性能方面的考虑,应该使用InnoDB表 , 对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打 开也可以),将大大提高性能。

MyISAM类型和InnoDB类型的一些细节和具体实现的差别:

1.InnoDB你支持FULLEXIT类型的索引。

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

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

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

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

6.另外,InnoDB表的行级锁也不是绝对的,例如在执行一个SQL语句时Mysql不能确定要扫描的范围,InnoDB的表会被全锁全表,例如update table set num = 1 where name like "�d%".

两种类型的主要区别就是InnoDB支持事务处理与外键和行级锁,而MyISAM不支持。