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 适合频繁修改以及涉及到安全性较高的应用。