一:构成上的区别mysql
每一个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。 数据文件的扩 展名为.MYD (MYData)。 索引文件的扩 展名是.MYI (MYIndex)。 |
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操做系统文件的大小,通常为 2GB |
MyISAM引擎设计简单,数据以紧密格式存储,而且因为分为三个文件,能够放到不一样的磁盘,能够同时操做,磁盘IO更快;MyISAM 默认会把索引读入内存,直接在内存中操做;InnoDB 则是 I/O 操做;sql
而且MyISAM索引是单独的文件,能够对索引进行压缩;数据库
二:事务处理oracle
MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,可是不提供事务支持 | InnoDB提供事务支持事务,外部键等高级 数据库功能 |
MyISAM因为设计简单,不支持事物性能
三:锁优化
表锁spa |
提供行锁(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基本等于废弃了!