Mysql回滚Myisam和Innodb

一 . MyISAM是 默认存储引擎。

它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。 8 f' S* Q2 ^! i; Z3 Z
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 3 P4 v- ?- T; C+ v1 o6 R9 I
  
二 . InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
   0 {; H3 I" D( ^: b8 e
InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的 空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
     G1 q, L* U( {
InnoDB是为处理 巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
   . r$ O2 {, A# m. g
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 3 [& k, J% q: ~8 S$ h) f! A3 S; f' x7 v
     e5 s! [$ w+ \! c9 K4 X
InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在 ) Y  ]! c2 p9 o, p! U2 B; @
   " s1 B- P( T- y. \& g
MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
   $ @6 C# I+ v& R' A# A- U2 D% |
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的 默认表。
  
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。 Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
  
三 . 简单概括几点如下:
   ! n4 l$ |& L1 G" O
1.通过不上不难看出,MyIsam InnoDB的用途,Myisam主要适用于 中小型数据量。InnoDB引擎适用 于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[ magento]就是采用InnoDB创建。 ; ^9 w) H9 w! d4 a. k6 o0 E
2. MyIsam写入速度比InnoDB快。 0 @  T, n9 E+ R/ c$ S7 T/ g
3.在使用InnoDB时候需要对 my.cnf进行配置以保证mysql达到最大效率。详细可以查看官网[inndo性能调节]: http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning
其中有很多人在网上发表了关于mysql MyIsam 和 InnoDB在存贮和读取方面的差异。暂时还没有做过度研究。 + a# M5 I0 T- A' b5 r0 |% q
基本测试都是基于使用[事务]和不使用[事务],进行对比。mysql对于[非事务表]速度会比较块。   S& N! ~9 _1 W' q
   4 [+ c# n' P6 S" l! a
◆1.InnoDB不支持FULLTEXT类型的索引。
1 X, j' x% F2 j* Q
◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
3 t) [. W$ P: A! ~: F- P) P
◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。 5 b/ j9 j8 }1 j/ O

◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
1 w" w, b8 _- {5 k) x- d
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

   / \* u6 _2 {- c( s3 {
InnoDB性能调节提示<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
如果Unix顶层工具或者Windows任务管理器显示,你的数据库的工作负荷的CPU使用率小于70%,则你的工作负荷可能是磁盘绑定的,可能你正生成太多的事务和提交,或者缓冲池太小。使得缓冲池更大一些会有帮助的,但不要设置缓冲池等于或超过物理内存的80%. * D5 T3 L8 O& C6 q1 s- w1 {* C
·         把数个修改裹进一个事务里。如果事务对数据库修改,InnoDB在该事务提交时必须刷新日志到磁盘。因为磁盘旋转的速度至多167转/秒,如果磁盘没有骗操作系统的话,这就限制提交的数目为同样的每秒167次。
·         如果你可以接受损失一些最近的已提交事务,你可以设置my.cnf文件里的参数innodb_flush_log_at_trx_commit为0。 无论如何InnoDB试着每秒刷新一次日志,尽管刷新不被许可。 9 `1 j: y$ e* ^# o; _- Q: p
·         使用大的日志文件,让它甚至与缓冲池一样大。当InnoDB写满日志文件时,它不得不在一个检查点把缓冲池已修改的内容写进磁盘。小日志文件导致许多不必要的吸盘写操作。大日志文件的缺点时恢复时间更长。
·         也让日志缓冲相当大(与8MB相似的数量)。 3 A* O, Z1 ?. i$ F4 c1 I
·         如果你存储变长度字符串,或者列可能包含很多NULL值,则使用VARCHAR列类型而不是CHAR类型。一个CHAR( N)列总是占据 N 字节来存储,即使字符串更短或字符串的值是NULL。越小的表越好地适合缓冲池并且减少磁盘I/O。
当使用row_format=compact (MySQL 5.1中默认的InnoDB记录格式)和可变长度字符集,比如UTF-8或sjis,CHAR( N)将占据可变数量的空间,至少为 N 字节。
·         在一些版本的GNU/Linux和Unix上,用Unix的fsync()(InnoDB默认使用的)把文件刷新到磁盘,并且其他相似的方法是惊人的 慢。如果你不满意数据库的写性能,你可以试着设置my.cnf里的innodb_flush_method为O_DSYNC,虽然O_DSYNC在多数系 统上看起来更慢。
·         当在Solaris 10上,为x86_64架构(AMD Opteron)使用InnoDB存储引擎,重要的是使用forcedirectio选项来安装任何为存储与InnoDB相关的文件而使用的数据系统。 (默认在Solaris 10/x86_64上不使用这个文件系统安装选项)。使用forcedirectio 失败会导致InnoDB在这个平台上的速度和性能严重退化。
·         当导入数据到InnoDB中之时,请确信MySQL没有允许autocommit模式,因为允许autocommit模式会需要每次插入都要刷新日志到 磁盘。要在导入操作规程中禁止autocommit模式,用SET AUTOCOMMIT和COMMIT语句来包住导入语句:
·                SET AUTOCOMMIT=0;·                /* SQL import statements ... */·                COMMIT; 6 r  V5 v! v; R
如果你使用 mysqldump 选项--opt,即使不用SET AUTOCOMMIT和COMMIT语句来包裹,你也使得快速的转储文件被导入到InnoDB表中。
·         小心大宗插入的大回滚:InnoDB在插入中使用插入缓冲来节约磁盘I/O,但是在相应的回滚中没有使用这样的机制。一个磁盘绑定的回滚可以用相应插入 花费时间的30倍来执行。杀掉数据库进程没有是帮助的,因为回滚在服务器启动时会再次启动。除掉一个失控的回滚的唯一方法是增大缓冲池使得回滚变成CPU 绑定且跑得快,或者使用专用步骤,请参阅15.2.8.1节,“强制恢复”。
·         也要小心其它大的磁盘绑定操作。用DROP TABLE或CREATE TABLE来清空一个表,而不是用DELETE FROM tbl_name。 0 d) T. c4 B/ |  U8 c& J, ]
·         如果你需要插入许多行,则使用多行插入语法来减少客户端和服务器之间的通讯开支: / t3 {% ]# d( K( [! z5 E
·                INSERT INTO yourtable VALUES (1,2), (5,5), ...;
这个提示对到任何表类型的插入都是合法的,不仅仅是对InnoDB类型。 9 |/ M4 W1 c( t
·         如果你在第二个键上有UNIQUE约束,你可以在导入会话中暂时关闭唯一性检查以加速表的导入:
·                SET UNIQUE_CHECKS=0; : S1 @8 E# ?( Q1 m" G' S- c
对于大表,这节约了大量磁盘I/O,因为InnoDB可以使用它的插入缓冲来在一批内写第二个索引记录。
·         如果你对你的表有FOREIGN KEY约束,你可以在导入会话过程中通过关闭外键检查来提速表的导入:
·                SET FOREIGN_KEY_CHECKS=0; 4 u% H/ p3 z' n
对于大表,这可以节约大量的磁盘I/O。
·         如果你经常有对不经常更新的表的重发查询,请使用查询缓存:
·                [mysqld]·                query_cache_type = ON·                query_cache_size = 10M

转载于:https://my.oschina.net/baixinxing/blog/56917

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值