免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1401 | 回复: 0
打印 上一主题 下一主题

myisam和innodb区别比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:53 |只看该作者 |倒序浏览

两种类型最主要的差别就是 InnoDB 支持事务处理与外键.而MyISAM不支持.因为MyISAM相对简单所以 在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦..

 InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。

可以看出在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。

另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。

基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。

MyIsam写入速度比InnoDB快

基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

以下是一些细节和具体实现的差别:

  ◆1.InnoDB不支持FULLTEXT类型的索引。

  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  ◆5.LOAD 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都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。

  原因如下:

  1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

  2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

  3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。

  4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

  5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

  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千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。

存储引擎- - My I SAM, I n n oDB ,其他
MyISAM 相对更适合插入不多不频繁,查询较多的应用环
境:不支持事务、只能是锁全表、不支持外键、不支持
WAL(write ahead logging)
 InnoDB适合大并发写入和查询的环境:支持事务(ACID
兼容)、行锁、外键、具备自己的内存缓冲池、独立的表
空间(不受大文件限制)
 Merge其实就是MRG_MyISAM,适用于将相同类型的多
种子表合并成一个大表,便于操作,但是无法完全利用到
索引的好处
 ARCHIVE存储引擎被用来以非常小的覆盖区存储大量无
索引数据。 是只读类型。

MyISAM 优化
key_buffer_size 分配给MyISAM索引缓存的内存总数
● query_cache_size 控制分配给查询缓存的内存总量
● long_query_time 设定慢查询时间
● external-locking 禁止使用外部锁,可预防死锁
● back_log 临时停止响应新请求前在短时间内可以堆起多少请求。如
果你需要在短时间内允许大量连接,可以增加该数值
● table_cache 缓存数据表的数量,避免重复打开表的开销
● thread_cache_size 缓存可重用线程数,见笑创建新线程的开销
● sort/join/read buffer size 分配给每个线程中处理排序/扫描表连
接及索引的内存
● skip-bdb 等,禁用不必要的引擎

InnoDB 优化


● 如果数据库CPU使用率小于70%,则MySQL的压力可能在于磁盘
因素,可能有太多的事务和提交,或者缓冲池太小。可以另缓冲池更
大一些,但不要设置缓冲池等于或超过物理内存的80%
● 把多个修改(INSERT/UPDATE/DELETE)放在一个事务里。但是也要
注意有此产生的效率问题
● innodb_flush_log_at_trx_commit 设置为0(每秒刷新),1(实时
刷新),2(只写日志文件,不刷新到磁盘)
● 使用较大日志文件及较大日志缓冲
● 往innoDB表导入数据时,先关闭autocommit模式,否则会实时
刷新数据到磁盘
● 更多的请查看:http://imysql.cn/?q=node/116
innodb_buffer_pool_size 控制分配给包括集群数据以及
次要索引页的Innodb缓存的内存总数,默认16MB
● innodb_additional_mem_pool_size 控制分配给对
Innodb内部数据字典进行排序所需的缓冲,默认1MB
● innodb_log_buffer_size 控制分配给对Innodb存储提前
写日志记录所需的缓冲,默认1MB
● innodb_log_files_in_group 在日志组里日志文件的数
目。InnoDB以循环方式写进文件。默认是2(推荐)
● innodb_log_file_size 默认是5MB。建议值从1MB到N
分之一缓冲池大小,其中N是组里日志文件的数目

其他优化 - -
char 型 vs int 型
● 独立索引 vs 联合索引
● 记录 slow queries
● 使用存储过程、触发器、视图
● 定期执行optimize / analyze table
● 针对Innodb表,尽量不执行 SELECT COUNT(*) 语句
● 善用 EXPLAIN来帮助你分析查询优化情况
● 如果需要对一个较大的且并发读写较多的数据表做 GROUP BY 等统
计操作,建议使用摘要表来存储统计信息,定期更新统计表
表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引
速度快多了
● 大部分情况下,字符类型的字段索引值需要一部分
● 尽量使用最合适的数据类型,不要浪费空间和效率
● 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存
在的索引
● 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询
● 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就
可以利用索引,否则无法使用索引.如 ... `name` LIKE 'yejr%'
● 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段
(VARCHAR、BLOB和TEXT)
● 分摊压力,使用集群/复制
● 查询时如果有 ORDER BY分句

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP