为什么MyISAM是表锁

MyISAM和InnoDB是MySQL两种最常用的存储引擎,最近几次面试都有问到区别,感觉答得不好,今天专门抽时间研究下。

设计目标

InnoDB设计目标是处理大容量的数据,而MyISAM追求的是性能,两者产生的差异也是基于这点。 InnoDB是MySQL的默认存储引擎。

事务处理

InnoDB支持事务和外键,MyISAM不支持。MyISAM强调的是性能,InnoDB支持的功能更加完整。InnoDB支持事务带来了一个好处,发生故障时可以通过事务日志来恢复数据库,MyISAM特别要命的一点是崩溃后不能安全恢复,所以对于表比较大的情况不要用。

效率和锁

两种存储引擎的效率差异来自于锁的方式差异,MyISAM是表锁,对数据库进行写操作时会锁住整个表,效率很低;确定要修改数据的范围时,InnoDB是行锁,只锁一行的数据,写操作很快。但也有特例,比如UPDATE student SET age=10 WHERE name LIKE ‘王%’,这种情况不能确定要UPDATE的行位置,InnoDB同样会锁住整个表。

索引

MyISAM支持全文索引,InnoDB不支持。

COUNT(*)

MyISAM保存了表的行数,InnoDB没有。也就是说,执行SELECT COUNT(*) FROM student的操作时,MyISAM可以直接给出结果,而InnoDB要先扫描全表。不过对于加了where条件的查询操作,效果是一样的。

AUTO_INCREMENT

InnoDB下只能对自增字段单独建索引,MyISAM下可以和其它列一起建联合索引。

然并卵

上面都是从网上东拼西凑总结出来的,有些博客相互还有冲突,醉了。有一点我特别奇怪,为什么MyISAM是表锁,InnoDB是行锁,MyISAM比InnoDB读性能还会好呢?搜了好多地方都没找到答案,老大苏武说其实不一定,只是某些情况会快一些,而且用MyISAM的人少。刚好最近我看公司的wiki,公司内部是强制用InnoDB做存储引擎的,我猜可能是出于事务和数据恢复的考虑。
还有其它一些区别,不一一列出来了。感觉这篇博客还有要完善的地方,不过基本的知识点已经涉及到了,有空再进一步研究吧。

瞎扯

实习一个多月了,很多零散的东西都在印象笔记里,加上面了几家公司,有很多想总结整理的东西。这周立了个flag,一天一篇博客,希望能不食言。

转自

http://cxymrzero.github.io/blog/2015/08/17/myisam-innodb/

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值