MySQL中的 MyISAM和InnoDB 区别

一:构成上的区别

每个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。
.frm文件存储表定义。
数据文件的扩 展名为.MYD (MYData)。
索引文件的扩 展名是.MYI (MYIndex)。
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB

    MyISAM引擎设计简单,数据以紧密格式存储,并且由于分为三个文件,可以放到不同的磁盘,可以同时操作,磁盘IO更快;MyISAM 默认会把索引读入内存,直接在内存中操作;InnoDB 则是 I/O 操作;

  并且MyISAM索引是单独的文件,可以对索引进行压缩;

二:事务处理

MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部键等高级 数据库功能

MyISAM由于设计简单,不支持事物

三:锁




 

表锁

提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执 行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

innodb是行锁,myism是锁表,因此有innodb写更快的说法

在更新少,读取多的应用中,myism更快,虽然是表锁,但锁的时候少,利用索引分开优势,可以读入内存,快速查询。但是如果更新频繁,经常锁表,读取性能会极速下降。
innodb适合更新频繁的场景,否则更新效率也不如myism。innodb索引数据混在一个文件,建立索引比myism复杂,在更新不频繁的应用场景中,myism更快


四:表的具体行数

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

myisam属于堆表,数据写入一直累积(concurrent_insert参数设置为2);此时写入性能比innodb好,但是无论是主键查询还是非主键查询,都不可避免的需要二次io(除非能索引内完成字段记录返回)
innodb属于聚簇索引组织表(主键索引即数据),由于必须保证索引有序,在写入时需要找到合适的位置进行插入,有时候还会导致二叉树调整所以写入性能比myisam要差;但是主键查找时只需要一次io即可返回数据,非主键索引查询时如果在索引内不能完成查询记录返回则需要第二次的io

五:清空表

InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表

六:InnoDB不支持FULLTEXT类型的索引

总结:mysql5.6之后,官方就不推荐MyISAM,InnoDB经过后面一系列优化之后,性能以及达到百万QPS,MyISAM基本等于废弃了!

猜你喜欢

转载自my.oschina.net/u/2548090/blog/1559710