两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持。
◆1.InnoDB不支持FULLTEXT类型的索引。
◆2.InnoDB 中不保存表的具体行数,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
◆6.InnoDB表的行锁不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
◆7.select count(*) 和order by 操作Innodb其实也是会锁表的,Innodb是行级锁只是where对它主键是有效,非主键的都会锁全表的。
◆8.MyISAM的读性能是比Innodb强。
◆9. MyISAM的索引和数据是分开的,并且索引是有压缩的,提高内存使用率。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
◆10. 迁移数据,备份还原,MyISAM只要对应表的frm.MYD,MYI的文件,在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,但是sql文件一般比较大。
myisam和innodb索引实现
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的,与InnoDB的聚集索引区分。
InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)。
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
InnoDB适用场景
1.需要事务的操作;
2.更新数据需要使用行级锁;
3.大数据量读写;
MyISAM适用场景
1.不需要事务的操作;
2.插入、更新少,读取频繁;
3.频繁的统计计算。
网友评论