(笔试题)MySQL的InnoDB和MyISAM的区别:
1.在事务上:myisam不支持事务,innodb支持事务。这个也是一个事务失效的缘由之一
2myisam使用了表级锁,innodb使用了行级锁
3.mysql5.0后面的版本默认使用innodb引擎,5.0以前都是用myisam引擎
4.InnoDB支持外键,而MyISAM不支持
5.InnoDB不支持全文索引,而MyISAM支持。
六、场景选择
MyISAM
不须要事务支持(不支持)
并发相对较低(锁定机制问题)
数据修改相对较少(阻塞问题),以读为主
数据一致性要求不是很是高
尽可能索引(缓存机制)
调整读写优先级,根据实际需求确保重要操做更优先
启用延迟插入改善大批量写入性能
尽可能顺序操做让insert数据都写入到尾部,减小阻塞
分解大的操做,下降单个操做的阻塞时间
下降并发数,某些高并发场景经过应用来进行排队机制
对于相对静态的数据,充分利用Query Cache能够极大的提升访问效率
MyISAM的Count只有在全表扫描的时候特别高效,带有其余条件的count都须要进行实际的数据访问mysql
InnoDB
须要事务支持(具备较好的事务特性)
行级锁定对高并发有很好的适应能力,但须要确保查询是经过索引完成
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大,能够利用InnoDB较好的缓存能力来提升内存利用率,尽量减小磁盘 IO
主键尽量小,避免给Secondary index带来过大的空间负担
避免全表扫描,由于会使用表锁
尽量缓存全部的索引和数据,提升响应速度
在大批量小插入的时候,尽可能本身控制事务而不要使用autocommit自动提交
合理设置innodb_flush_log_at_trx_commit参数值,不要过分追求安全性
避免主键更新,由于这会带来大量的数据移动
七、mysql性能讨论sql
MyISAM最为人垢病的缺点就是缺少事务的支持数据库
InnoDB 的磁盘性能很使人担忧缓存
MySQL 缺少良好的 tablespace 安全
两种类型最主要的差异就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.因此MyISAM每每就容易被人认为只适合在小项目中使用。服务器
我做为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,可是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来讲的话,MyISAM绝对是个人首选。架构
缘由以下:并发
一、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强很多的。运维
二、MyISAM的索引和数据是分开的,而且索引是有压缩的,内存使用率就对应提升了很多。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会形成Innodb比MyISAM体积庞大不小。memcached
三、从平台角度来讲,常常隔1,2个月就会发生应用开发人员不当心update一个表where写的范围不对,致使这个表无法正经常使用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,而后dump成sql再导回到主库,并把对应的binlog补上。若是是Innodb,恐怕不可能有这么快速度,别和我说让Innodb按期用导出xxx.sql机制备份,由于我平台上最小的一个数据库实例的数据量基本都是几十G大小。
四、从我接触的应用逻辑来讲,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操做,而这种操做Innodb其实也是会锁表的,不少人觉得Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
五、还有就是常常有不少应用部门须要我给他们按期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们本身在对应版本的数据库启动就行,而Innodb就须要导出xxx.sql了,由于光给别人文件,受字典数据文件的影响,对方是没法使用的。
六、若是和MyISAM比insert写操做的话,Innodb还达不到MyISAM的写性能,若是是针对基于索引的update操做,虽然MyISAM可能会逊色Innodb,可是那么高并发的写,从库可否追的上也是一个问题,还不如经过多实例分库分表架构来解决。
七、若是是用MyISAM的话,merge引擎能够大大加快应用部门的开发速度,他们只要对这个merge表作一些select count(*)操做,很是适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
固然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,所以我我的也是很喜欢Innodb的,只是若是从数据库平台应用出发,我仍是会首选MyISAM。
另外,可能有人会说你MyISAM没法抗太多写操做,可是我能够经过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,天天十多亿 pv的动态页面,还有几个大项目是经过数据接口方式调用未算进pv总数,(其中包括一个大项目由于初期memcached没部署,致使单台数据库天天处理 9千万的查询)。而个人总体数据库服务器平均负载都在0.5-1左右