[转]InnoDB和MyISAM区别

From : http://blog.csdn.net/ghosc/article/details/5391544mysql

MySQL做为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤为那些针对并发性处理的机制。今天,咱们先了解一下MySQL中数据表的分类,以及它们的一些简单性质。 
截至目前,MySQL一共向用户提供了包括DBD、HEAP、ISAM、MERGE、MyIAS、InnoDB以及Gemeni这7种表。其中DBD、InnoDB属于事务安全类表,而其余属于事务非安全类表。
sql

 
DBD 
Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司开发。它提供MySQL用户期待已久的功能--事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,由于它们确保一组命令能成功地执行或回滚。
数据库


HEAP 
HEAP表是MySQL中存取数据最快的表。这是由于他们使用存储在动态内存中的一个散列索引,不过若是MySQL或服务器崩溃,这些内存数据将会丢失。
安全


ISAM 
ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。
服务器


MERGE 
MERGE是一个有趣的新类型,在3.23.25以后出现。一个MERGE表其实是又一个MyISAM表的集合,合并而成的一个表,主要是为了效率的考虑,由于这样不只仅能够提升速度、搜索效率、修复效率并且还节省了磁盘空间。
并发


MyIASM 
MyIASM基于了IASM代码,应该能够说是IASM的衍生品,不过增长了很多有用的扩展。它是MySQL的默认数据 表类型,基于了传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,通常来讲,它是存储记录和文件的标准方法。与其余存储引擎比较,MyISAM具备检查和修复表格的大多数工具。ISAM表格能够被压缩,并且它们支持全文搜索,不过它们是事务不安全的,并且也不支持外键。若是事务回滚将会形成不彻底回滚,从而不具有原子性。因此假如忽略事务以及访问并发性的话,而且须要执行大量的SELECT检索语句的话,MyISAM将是最好的选择。 
MyIASM比较好的缘由: 
MyIASM表小于IASM表,因此使用较少资源。 
MyIASM表在不一样的平台上二进制层可移植。 
MyIASM拥有更大的键码尺寸,更大的键码上限。 
对于MyISAM存储引擎来讲,它的读锁和写锁是互斥的,从而读写操做是串行的。那么,一个进程请求某个 MyISAM表的读锁,同时另外一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先得到锁。不只如此,即便读请求先到锁等待队列,写请求后 到,写锁也会插到读锁请求以前!这是由于MySQL认为写请求通常比读     请求要重要。这也正是MyISAM表不太适合于有大量更新操做和查询操做应用的原 因,由于,大量的更新操做会形成查询操做很难得到读锁,从而可能永远阻塞。这种状况有时可能会变得很是糟糕!幸亏咱们能够经过一些设置来调节MyISAM 的调度行为。经过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。经过执行命令SET LOW_PRIORITY_UPDATES=1,使该链接发出的更新请求优先级下降。经过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,下降该语句的优先级。虽然上面3种方法都是要么更新优先,要么查询优先的方法,但仍是能够用其来解决查询相对重要的应用(如用户登陆系统)中,读锁等待严重的问题。另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级下降,给读进程必定得到锁的机会。 
上面已经讨论了写优先调度机制带来的问题和解决办法。这 里还要强调一点:一些须要长时间运行的查询操做,也会使写进程“饿死”!所以,应用中应尽可能避免出现长时间运行的查询操做,不要总想用一条SELECT语 句来解决问题,由于这种看似巧妙的SQL语句,每每比较复杂,执行时间较长,在可能的状况下能够经过使用中间表等措施对SQL语句作必定的“分解”,使每 一步查询都能在较短期完成,从而减小锁冲突。若是复杂查询不可避免,应尽可能安排在数据库空闲时段执行,好比一些按期统计能够安排在夜间执行。
工具


InnoDB 
InnoDB是MySQL 4.0以后推出的一种比较新的数据表类型,这种类型是事务安全的。它与BDB类型具备相同的特性,它们还支持外键。InnoDB表格速度很快具备比BDB还丰富的特性,所以若是须要一个事务安全的存储引擎,建议使用它。若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,一样应该使用InnoDB表。对于支持事务的InnoDB类型的表来讲,影响速度的主要缘由是AUTOCOMMIT默认设置是打开的,并且程序没有显式调用BEGIN 开始事务,致使每插入一条都自动提交,严重影响了速度。能够在执行sql前调用begin,多条sql造成一个事物(即便autocommit打开也能够),将大大提升性能。
性能

查看autocommit:select @@autocommit;spa

设置autocommit:set autocommit=0;.net

在MySQL5.1中,如何在启动时就禁止autocommit? 

配置中加入init_connect= 'SET AUTOCOMMIT=0'


Gemeni 
Gemeni表,据据说也是在MySQL 4.0以后推出的,不过截至当前,不多有针对它的介绍,一样应用也就更少了,咱们暂时不做介绍。 

MySQL的数据表类型不少,其中比较重要的是MyISAM,InnoDB这两种。 
这两种类型各有优缺点,须要根据实际状况选择适合的,MySQL支持对不一样的表设置不一样的类型。下面作个简单的对比:
MyISAM表类型是一种比较成熟稳定的表类型,可是MyISAM对一些功能不支持。


                       MyISAM                    InnoDB 
    事务               不支持                     支持 
    数据行锁定         不支持,只有表锁定         支持 
    外键约束           不支持                     支持 
    表空间大小         相对小                     相对大,最大是2倍 
    全文索引           支持                       不支持 
    GIS数据            支持                       不支持 
    COUNT问题          无                         执行COUNT(*)查询时,速度慢

 

SQL举例: 【CREATE TABLE tb_test TYPE=HEAP (name char(10) NOT NULL, numb char(8) NOT NULL, PRIMARY KEY(name))】 --------------------------------------------------------------------------------------------- 1. 能够执行如下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:    ALTER TABLE tablename type = INNODB; 2. INNODB表不能用REPAIR TABLE命令和MYISAMCHK -r table_name    但能够用CHECK TABLE,以及MYSQLCHECK [OPTIONS] database [tables] 3. 启动mysql数据库的命令行中添加了如下参数可使新发布的mysql数据表都默认为使用事务(只影响到create语句。)   –default-table-type = InnoDB 4. 临时改变默认表类型能够用:      SET table_type = INNODB;      SHOW VARIABLES LIKE 'table_type';    或:      c:/mysql/bin/mysqld-max-nt –standalone –default-table-type=InnoDB

相关文章
相关标签/搜索