本文目录:
1、概述
2、MyISAM
3、Innodb
4、对比
5、总结
1、概述
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。而且,需要注意的是,存储引擎是针对数据表进行指定的。比如,我们通过navicat连接MySQL数据库的时候,可以在设计表结构的时候发现存储引擎的选项。如下图:
通过下拉选框可以看到有多种存储引擎可以选择。所以,我们要在设计数据表的时候,根据自己的业务特点,结合各个存储引擎的优缺点,选择合适的存储引擎。
当然我们也可以在代码创建表的时候通过type参数来指定具体的存储引擎,如下:
CREATE TABLE tblMyISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
) TYPE=MyISAM
CREATE TABLE tblISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
) TYPE=Innodb
2、MyISAM
(1)简介
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB数据库引擎解决了这个问题。现在大多数时候我们使用的都是InnoDB存储引擎,但是在某些情况下使用MyISAM更好,比如:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。
(2)MyISAM特点
- 不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁;
- 不支持事务(所以当数据库奔溃的时候,无法完全恢复)
- 不支持外键
- 不支持崩溃后的安全恢复
- 在表有读取查询的同时,支持往表中插入新纪录(读的同时,允许插入记录)
- 支持BLOB和TEXT的前500个字符索引,支持全文索引
- 支持延迟更新索引,极大地提升了写入性能
- 对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用
3、Innodb
(1)简介
InnoDB是MySQL的默认数据库引擎(5.5版之后)。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
(2)特点
- 支持行锁,采用MVCC来支持高并发,有可能死锁
- 支持事务
- 支持外键
- 支持崩溃后的安全恢复
- 不支持全文索引
4、对比和区别
(1)count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。
(2) 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
(3)是否支持外键: MyISAM不支持,而InnoDB支持。
(4)支持的锁粒度:MyISAM只支持表级锁,InnoDB既支持表锁也支持行锁。
5、总结
(1)MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。
(2)一般来说,如果需要事务支持,可靠性要求比较高,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),插入不频繁,查询非常频繁,或者需要做很多count 计算,而且不需要支持事务时,MyISAM是最好的选择。