1. 什么是存储引擎
存储引擎是MySQL的组件,用于处理不同表类型的SQL操作。通俗将是指定表如何存储数据,如何为存储的数据 建立索引 以及 如何更新,查询数据等技术实现的方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)
不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
在MySQL中可以使用show engines; 查看支持的引擎。
MySQL server中引擎的位置:
2. MySQL引擎
2.1 MyISAM
5.5版之前,MyISAM是MySQL的默认数据库引擎,每个MyISAM在磁盘上存储成三个文件:
- frm文件:存储表的定义数据
- MYD文件:存放表具体记录的数据
- MYI文件:存储索引
MyISAM类型的表支持三种不同的存储结构:静态型、动态型、压缩型:
- 静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式;
- 动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低。
- 压缩型:数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。
MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁。MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。
场景:如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。
2.2 InnoDB
InnoDb在磁盘上有两个文件;
- frm文件:存放表的定义数据;
- idb文件:存放索引和数据的文件。
InnoDB的特性为:
- MySQL默认存储引擎(MySQL 5.5 版本后).
- innodb 支持事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。
- innodb 支持自增长列(auto_increment),自增长列的值不能为空
- innodb 支持外键(foreign key),外键所在的表称为子表,而所依赖的表称为父表。
- innodb存储引擎支持行级锁。
- innodb存储引擎索引使用的是B+Tree
- 支持MVCC,应对高并发事务, MVCC比单纯的加锁更高效;MVCC只在
READ COMMITTED
和REPEATABLE READ
两个隔离级别下工作;MVCC可以使用乐观(optimistic)锁和悲观(pessimistic)锁来实现,各数据库中MVCC实现并不统一。
2.3 Memory
Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据.
2.4 小结
在某些场景下,如果不考虑并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题,MyISAM也是一个不错的选择;比如,对于从库,是不需要考虑并发等特性,可以直接用MyISAM;但《MySQL高性能》上面有一句话这样写到:
不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。
特性 | MyISAM | InnoDB | Memory |
---|---|---|---|
存储限制 | 256TB | 64TB | 有 |
事务 | 支持 | ||
锁粒度 | 表 | 行 | 表 |
B树索引 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | |
全文索引 | 支持 | ||
数据缓存 | 支持 | 支持 | |
索引缓存 | 支持 | 支持 | 支持 |
数据压缩 | 支持 | ||
批量插入 | 高 | 相对低 | 高 |
内存消耗 | 低 | 高 | 中 |
外键支持 | 支持 | ||
复制支持 | 支持 | 支持 | 支持 |
查询缓存 | 支持 | 支持 | 支持 |
备份恢复 | 支持 | 支持 | 支持 |