MyISAM和InnoDB的比较

MyISAM:

  • 不支持事务,而且也不支持外键,但是每次查询都是原子的
  • 支持表级锁,即每次操作是对整个表加锁
  • 一个MYISAM表有三个文件:索引文件、表结构文件(.frm文件)、数据文件(.MYD文件)
  • 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性

优点:查询数据相对较快,适合大量的select,可以全文索引。

缺点:不支持事务,不支持外键,并发量较小,不适合大量update

InnoDb:

  • 支持ACID的事务,支持事务的四种隔离级别;
  • 支持行级锁及外键约束:因此可以支持写并发;
  • 不存储总行数;
  • 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
  • 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

优点:支持事务,支持外键,并发量较大,适合大量update

缺点:查询数据相对较快,不适合大量的select

MyISAM与InnoDB的比较

基本的差别为:
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

两种存储引擎的大致区别表现在:

  • 1)InnoDB支持事务,MyISAM不支持。
  • 2)InnoDB支持外键,MyISAM不支持.
  • 3)从MySQL5.5.5以后,InnoDB是默认引擎.
  • 4)从MySQL5.6版本开始,InnoDB开始支持FULLTEXT类型的索引.之前的版本不支持全文索引。
  • 5)InnoDB中不保存表的行数,如select count(0) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(0)语句包含where条件时MyISAM也需要扫描整个表.
  • 6)对于自增长的字段,在MyISAM表中可以和其他字段一起建立联合索引.在InnoDB中,可以创建只有该字段的索引,也可以建立联合索引,但自增键必须在最左侧
  • 7)清空整个表(delete from )时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表. (这个区别貌似不是很重要哈)
  • 8)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'.
  • 9)MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小.
  • 10)MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。

关于MyISAM与InnoDB选择:

MYISAM和INNODB是Mysql数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定:

  • 1)如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。
  • 2)如果你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。
  • 3)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
    原文作者:Yangk
    原文地址: https://segmentfault.com/a/1190000019263351
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞