一 . 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