InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
◆1InnoDB不支持FULLTEXT类型的索引。
◆2InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的 *** 作是一样的。
◆3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
◆4DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
◆5LOAD TABLE FROM MASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
一、不是被淘汰。
1)如果是一些小型的应用或项目,那么MyISAM 会更适合。
2)如果使用一个超大数据量的项目,而且需要事务处理或外键支持,那么直接使用InnoDB方 式。
二、区别总结:
1InnoDB不支持FULLTEXT类型的索引。
2InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的 *** 作是一样的。
3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5LOAD TABLE FROM MASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
◆1InnoDB不支持FULLTEXT类型的索引。
◆2InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的 *** 作是一样的。
◆3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
◆4DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
◆5LOAD TABLE FROM MASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁而MyISAM不支持所以MyISAM往往就容易被人认为只适合在小项目中使用。
我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:999%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。
原因如下:
1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxxsql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。
4、从我接触的应用逻辑来说,select count() 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的 *** 作,而这种 *** 作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frmMYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxxsql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
6、如果和MyISAM比insert写 *** 作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update *** 作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count() *** 作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。
另外,可能有人会说你MyISAM无法抗太多写 *** 作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在05-1左右。
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取 *** 作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。
2/InnoDB
它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。
MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键吗统计分布。
更好和更快的auto_increment处理。
以下是一些细节和具体实现的差别:
1InnoDB不支持FULLTEXT类型的索引。
2InnoDB中不保存表的
具体行数,也就是说,执行select count() from
table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含
where条件时,两种表的 *** 作是一样的。
3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4DELETE
FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5LOAD TABLE FROM
MASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update
table set num=1 where name like “�a%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势
MySQL
Administrator建数据库的时候,表缺省是InnoDB类型。
InnoDB,MyISAM
两种类型有什么区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持,外键等高级数据库功能。
MyISAM类型的二进制数据文件可以在不同 *** 作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。
修改表的引擎类型:
ALTER
TABLE tablename ENGINE = MyISAM ;
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查看表信息,里面包括使用的引擎类型,字符编码,表结构等
使用这个命令
mysql>
show create table t1;--t1是表名
2
可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:
alter table t1
type=innodb;--t1是表名
3
innodb表不能用repair table命令和myisamchk -r table_name
但可以用check table
t1,以及mysqlcheck [OPTIONS] database [tables]
4
启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(
只影响到create语句。)
--default-table-type=InnoDB
5
临时改变默认表类型可以用:
set table_type=InnoDB;
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。MyIASM是IASM表的新版本,有如下扩展:二进制层次的可移植性。NULL列索引。对变长行比ISAM表有更少的碎片。支持大文件。更好的索引压缩。更好的键吗统计分布。更好和更快的auto_increment处理。以下是一些细节和具体实现的差别:1InnoDB不支持FULLTEXT类型的索引。2InnoDB中不保存表的具体行数,也就是说,执行selectcount()fromtable时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时,两种表的 *** 作是一样的。3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。4DELETEFROMtable时,InnoDB不会重新建立表,而是一行一行的删除。5LOADTABLEFROMMASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如updatetablesetnum=1wherenamelike“%aaa%”任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势MySQL中MyISAM引擎与InnoDB引擎性能简单测试[硬件配置]CPU:AMD2500+(18G)内存:1G/现代硬盘:80G/IDE[软件配置]OS:WindowsXPSP2SE:PHP521DB:MySQL5037Web:IIS6[MySQL表结构]CREATETABLE`myisam`(`id`int(11)NOTNULLauto_increment,`name`varchar(100)defaultNULL,`content`text,PRIMARYKEY(`id`))ENGINE=MyISAMDEFAULTCHARSET=gbk;CREATETABLE`innodb`(`id`int(11)NOTNULLauto_increment,`name`varchar(100)defaultNULL,`content`text,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=gbk;[数据内容]$name="heiyeluren";$content="MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:·MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。·MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。释:MEMORY存储引擎正式地被确定为HEAP引擎。·InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的 *** 作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所有MySQL51二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。·EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。";[插入数据-1](innodb_flush_log_at_trx_commit=1)MyISAM1W:3/sInnoDB1W:219/sMyISAM10W:29/sInnoDB10W:2092/sMyISAM100W:287/sInnoDB100W:没敢测试[插入数据-2](innodb_flush_log_at_trx_commit=0)MyISAM1W:3/sInnoDB1W:3/sMyISAM10W:30/sInnoDB10W:29/sMyISAM100W:273/sInnoDB100W:423/s[插入数据3](innodb_buffer_pool_size=1024M)InnoDB1W:3/sInnoDB10W:33/sInnoDB100W:607/s[插入数据4](innodb_buffer_pool_size=256M,innodb_flush_log_at_trx_commit=1,setautocommit=0)InnoDB1W:3/sInnoDB10W:26/sInnoDB100W:379/s[MySQL配置文件](缺省配置)#MySQLServerInstanceConfigurationFile[client]port=3306[mysql]default-character-set=gbk[mysqld]port=3306basedir="C:/mysql50/"datadir="C:/mysql50/Data/"default-character-set=gbkdefault-storage-engine=INNODBsql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"max_connections=100query_cache_size=0table_cache=256tmp_table_size=50Mthread_cache_size=8myisam_max_sort_file_size=100Gmyisam_max_extra_sort_file_size=100Gmyisam_sort_buffer_size=100Mkey_buffer_size=82Mread_buffer_size=64Kread_rnd_buffer_size=256Ksort_buffer_size=256Kinnodb_additional_mem_pool_size=4Minnodb_flush_log_at_trx_commit=1innodb_log_buffer_size=2Minnodb_buffer_pool_size=159Minnodb_log_file_size=80Minnodb_thread_concurrency=8总结可以看出在MySQL50里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是innodb_flush_log_at_trx_commit这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SETAUTOCOMMIT=0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在mycnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
以上就是关于innodb和myisam的区别全部的内容,包括:innodb和myisam的区别、mysql5.5的默认存储引擎是innodb,是不是myisam引擎要被淘汰了、mysql 中 myisam innodb 的区别有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)