MySQL存储引擎:MyISAM和InnoDB的区别

MyISAM和InnoDB的区别

定义

InnoDB:MySQL默认的事务型引擎,也是最重要和使用最普遍的存储引擎。它被设计成为大量的短时间事务,短时间事务大部分状况下是正常提交的,不多被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有很是特别的缘由须要使用其余的存储引擎,不然应该优先考虑InnoDB引擎。html

MyISAM:在MySQL 5.1 及以前的版本,MyISAM是默认引擎。MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,并且一个毫无疑问的缺陷是崩溃后没法安全恢复。mysql

事务

InnoDB:支持sql

MyISAM:不支持数据库

InnoDB:支持行锁、表锁。行锁是实如今索引上的,若是没有索引,就无法使用行锁,将退化为表锁。安全

MyISAM:支持表锁。并发

主键

InnoDB:必须有,没有指定会默认生成一个隐藏列做为主键函数

MyISAM:能够没有性能

索引

InnoDB:汇集索引,使用 B+ 树做为索引结构,数据文件和索引绑在一块儿,必需要有主键。主键索引一次查询;辅助索引两次查询,先查询主键,再查询数据;.net

MyISAM:非汇集索引,使用 B+ 树做为索引结构,索引和数据文件是分离的。主键索引和辅助索引是独立的。设计

外键

InnoDB:支持

MyISAM:不支持

AUTO_INCREMENT

InnoDB:必须包含只有该字段的索引。引擎的自动增加列必须是索引,若是是组合索引也必须是组合索引的第一列。

MyISAM:能够和其余字段一块儿创建联合索引。引擎的自动增加列必须是索引,若是是组合索引,自动增加能够不是第一列,他能够根据前面几列进行排序后递增。

数据库文件

InnoDB:frm是表定义文件,ibd是数据文件。支持两种存储方式:

  • 共享表空间存储:全部表的数据文件和索引都保存在一个表空间里,一个表空间能够有多个文件,经过 innodb_data_file_pathinnodb_data_home_dir 参数设置共享表空间的位置和名字,通常共享表空间的名字叫 ibdata1-n
  • 多表空间存储:每一个表都有一个表空间文件用于存储每一个表的数据和索引,文件名以表名开关,以.ibd为扩展名

MyISAM:frm是表定义文件,myd是数据文件,myi是索引文件。支持三种存储格式:静态表(默认,注意数据末尾不能有空格,会被去掉。)、动态表、压缩表。

表的行数

InnoDB:没有保存。select count(*) from table;会扫描全表。

MyISAM:保存。select count(*) from table;会直接取出该值。

注:但加了 where 条件后,二者处理方式同样,都是扫描全表。

全文索引

InnoDB:5.7及之后版本支持。

MyISAM:支持。

总结

InnoDB

  • 优势:支持事务,支持外键,并发量较大,适合大量 update。
  • 缺点:查询数据相对较快,不适合大量的 select。

MyISAM

  • 优势:查询数据相对较快,适合大量的 select,能够全文索引。
  • 缺点:不支持事务,不支持外键,并发量较小,不适合大量 update。

如何选择?

  • 你的数据库有外键吗?若有,选择 InnoDB
  • 你须要事务支持吗?如须要,选择 InnoDB
  • 你须要全文索引吗?在5.7及之后版本,均可选,优先考虑 InnoDB + Sphinx
  • 你常用什么样的查询模式?若是表中绝大多数都只是读查询,能够考虑 MyISAM,若是既有读写也挺频繁,请使用 InnoDB
  • 你的数据有多大?数据量大,选择 InnoDB,由于其支持事务处理和故障恢复。MyISAM 可能须要几小时或几天来恢复,InnoDB 只须要几分钟。
  • 你须要在线热备份吗?如须要,选择 InnoDB

参考资料

相关文章
相关标签/搜索