Heim  >  Artikel  >  Datenbank  >  MySQL表类型MyISAM/InnoDB的区别

MySQL表类型MyISAM/InnoDB的区别

PHPz
PHPzOriginal
2016-06-07 15:52:371000Durchsuche

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打开也可以),将大大提高性能。

使用时注意:

1、4.0以上MySQL都支持事务,包括非max版本。3.23的需要max版本MySQL才能支持事务。

2、创建表时如果不指定type则默认为MyISAM,不支持事务,可以用以下命令看表的类型:

show create table tablename

3、对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试如下:

--执行一个msyql:use test;drop table if exists tn;create table tn (a varchar(10)) type=myisam;drop table if exists ty;create table ty (a varchar(10)) type=innodb;begin;insert into tn values('a');
insert into ty values('a');select * from tn;select * from ty;--都能看到一条记录--执行另一个mysql:use test;select * from tn;select * from ty;--只有tn能看到一条记录--然后在另一边commit;--才都能看到记录。

4、可以执行以下命令来切换非事务表到事务(数据不会丢失),InnoDB表比MyISAM表更安全:

alter table tablename type=InnoDB;

5、InnoDB表不能用repair table命令和myisamchk -r table_name命令,但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

6、启动MySQL数据库的命令行中添加了以下参数可以使新发布的MySQL数据表都默认为使用事务(只影响到create语句)。

–default-table-type=InnoDB

--测试命令:use test;drop table if exists tn;create table tn (a varchar(10));
show create table tn;

7、临时改变默认表类型可以用:

set table_type=InnoDB;
show variables like 'table_type';--或命令行命令:mysqld -max-nt –standalone –default-table-type=InnoDB

8、对于MySQL来说,最具有代表性的表存储引擎就是InnoDB和MyISAM。两者之间最主要的区别就是是否进行外键的数据完整性检查。

InnoDB存储引擎支持对外键约束的检查功能,这些约束包括delete,update,cascade,外键约束检查(外键增强)的好处或者优点如下:

  • 如果关联设计恰当,可以使程序员更难将数据不一致性引入数据库。

  • 数据库服务器具有集中式约束检查功能,就可以不必再应用程序一侧对数据进行该类检查,从而避免了不同的引用程序使用不同的方式去检查约束。

  • 使用级联更新和删除,简化了应用程序代码。

  • 设计欠当的关联,有助于使用文档的方式记录表间的关系。

但是以上的好处,需要数据库服务器为执行此类检查花费额外的开销,增加了数据库服务器的负担,进而影响数据库的性能。

如果在表中不需要外键,也想避免引用完整性的检查,则可以选择使用MyISAM存储引擎。对于那些只有insert和select的应用程序,选择MyISAM会获得更好的性能。但是如果使用MyISAM引擎时,如果有外键关联,那么需要再应用程序级的层面上处理这类关联,使得数据的完整性获得保证。

DBA(数据库管理员)要创建拓扑关联,这样会导致恢复单个表变的困难(加载依赖其他表的表时,MySQL允许你临时禁止外键检查,从而降低了该难度)。对于存在外键的表的,需要注意这个问题。

更多相关教程请访问  MySQL视频教程

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn