浅谈InnoDB和MyISAM主要对比

① 事务

如果应用需要事务支持,那么InnoDB是最稳定的选择。如果不需要事务支持,且主要是SELECT和INSERT操作,那么MyISAM也是不错的选择。

② 锁粒度

MyISAM支持表级锁定。InnoDB支持行级锁,但是InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

③ 并发

InnoDB采用MVCC来支持高并发,并且实现了4个隔离型级别。MVCC理解为行级锁的变种,但是很多情况下避免了加锁操作,开销更低。同时实现了非阻塞读操作,写操作也只是锁定必要行。InnoDB的阻塞问题和隔离性级别有关,比如说可重复读级别下,UPDATE DELETE等“当前读”会被间隙锁阻塞。

MySQL 在InnoDB引擎下有当前读和快照读两种模式。
当前读即加锁读,读取记录的最新版本号,会加锁保证其他并发事务不能修改当前记录,直至释放锁。INSERT/UPDATE/DELETE操作默认使用当前读,SELECT语句加LOCK IN SHARE MODE或FOR UPDATE的查询也采用当前读模式。
快照读:不加锁,读取记录的快照版本,而非最新版本。使用MVCC机制,最大的好处是读取不需要加锁,读写不冲突,用于读操作多于写操作的应用,即普通的一条SELECT语句默认都是使用快照读MVCC实现模式。

MyISAM读写互相阻塞,不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

④ 索引

InnoDB(索引组织表)使用的聚簇索引、索引就是数据。MyISAM(堆组织表)使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引。

⑤ 细节说明

InnoDB 中不保存表的具体行数,注意的是,当COUNT(*)语句包含 WHERE条件时,两种表的操作是一样的。
DELETE FROM TABLE时,InnoDB不会重新建立表,而是一行一行的删除。
MyISAM的索引和数据是分开的,并且索引是有压缩的,可以提高内存使用率。而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

如果对INSERT速度较高要求,可以使用MyISAM。MyISAM只是将数据写到内存里,然后操作系统定期将数据刷写到磁盘上。
MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

为什么有人认为MyISAM会比Innodb 的查询速度快?(非官方结论)
InnoDB 在做SELECT的时候,要维护的东西比MYISAM引擎多很多
1)InnoDB 要缓存数据和索引,MyISAM只缓存索引块。
2)Innodb寻址要映射到块,再到行,MyISAM记录的直接是文件的OFFSET,定位比InnoDB要快。
3)InnoDB 还需要维护MVCC一致。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值