MyISAM和InnoDB的比较

34次阅读

共计 1674 个字符,预计需要花费 5 分钟才能阅读完成。

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)InnoDB 不支持 FULLTEXT 类型的索引.
  • 5)InnoDB 中不保存表的行数,如 select count(0) from table 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count(0)语句包含 where 条件时 MyISAM 也需要扫描整个表.
  • 6)对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立联合索引.
  • 7)清空整个表时,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 适合频繁修改以及涉及到安全性较高的应用。
正文完
 0