1、InnoDB引擎:
InnoDB是一个事务型的存储引擎,设计目标是处理大数据量数据时提供高性能的服务,会在运行时在内存建立缓冲池,用于缓冲数据和索引。
InnoDB引擎优点:
- 支持事务处理,ACID事务特性:原子性、一致性、隔离性、持久性
- 实现了SQL标准的四种隔离级别:未提交读、已提交读、不可重读、可串行化
- 支持行级锁和外键约束
- 可以利用事务日志进行数据恢复
InnoDB引擎缺点:
- 不支持fulltext类型的索引。因为它没有保存表的行数,当使用COUNT统计时会扫描全表
InnoDB引擎适用场景:
- 需要事务的操作
- 更新数据需要使用行级锁(同步)
- 大数据量读写
- 大型互联网应用
2、MyISAM引擎:
MyISAM是MySQL默认的引擎,它的设计目的是快速读取
MyISAM引擎优点:
- 高性能读写
- 因为它保存了表的行数,当使用COUNT统计时不会扫描全表
MyISAM引擎缺点:
- 不支持数据库事务
- 不支持行级锁和外键
- insert和update操作需要锁定整个表
- 不支持故障恢复
MyISAM引擎使用场景:
- 不需要事务的操作
- 插入、更新少、读取频繁
- 频繁的统计计算
3、其他存储引擎比较:
![](https://img.haomeiwen.com/i3041268/9e2ffb0bf2588156.png)
4、存储引擎架构:
存储引擎必须与MySQL服务器节点整合,所有表都各有一个.frm文件,其中包含表定义(列名称、类型大小、键信息和其他表属性),.frm文件实质上可以收集和存储来自create table 的信息,文件名与表名相同,并且驻留在与数据库名称相对应的目录中。
对于每种存储引擎,服务器会读取.frm文件中的表定义。然后将其存在表告诉缓存中。通过这种方式,在下次需要访问表时,服务器就不必重新读取和分析.frm文件,而是使用高速缓存的信息
5、InnoDB架构:
-
InnoDB是目前MySQL中最复杂的存储引擎之一,它支持事务、多版本、行锁和外键。拥有可以管理I/O和内存的扩展系统,也拥有死锁检测内部机制,可执行快速而可靠的崩溃恢复,可以实现大量优化算法,以克服支持事务的传统数据库的性能限制
-
与MyISAM不同的是,MyISAM总是在文件中存储数据,而InnoDB则是使用表空间,一个表空间可以存储在一个文件中,或存储在一个原始分区中。所有的表可以存储在同一个表空间中,或者每个表单独占有一个表空间。
-
数据存储在名为簇索引的特殊结构中,即将主键作为键值的B树,实际记录则存在数据部件中。因此每个InnoDB表必须具有一个主键,如果没有则增加一个用户通常无法看见的特殊ID列行,作为主键。
- 主键和次键都存储在磁盘上的B树中,但是在缓存索引页时,InnoDB将在内存中构建一个自适应散列索引,以便加速高速缓存页的索引查找速度。
InnoDB保存两种日志:
- 撤销日志:目的是回滚事务,以及现实旧版本的查询数据
- 重做日志:存储要在崩溃恢复中使用的信息,允许恢复过程汇总重新执行在崩溃之前可能已经完成或者可能还没完成的事务,重新执行完这些事务后,数据库进入一致性状态
6、MyISAM架构:
MyISAM存储引擎在本地磁盘上存储数据,除了对于所有都有相同的.frm文件外,它使用连个附加文件:数据文件(.MYD)和索引文件(.MYI)
- 数据文件:实质是带有一些元信息的表记录的级连记录格式分固定长度和可变长度两种
- 索引文件:包含了一个对各种键和列属性进行说明的详细记录头,同时包含大量元信息,之后是实际键页,基本结构如下:
![](https://img.haomeiwen.com/i3041268/3cd396dd0b81e8b8.png)
-
MyISAM键类型:MyISAM支持三种键类型:常规B树、纯文本(使用B树)、空间型(使用R树)
-
B树:B树是一种常用的存储引擎结构,包含节点和非叶节点(也成为I页:每个节点大小与操作系统的页大小相同,IO操作时不会产生碎片),默认状况下,每个页大小为1024字节,第一个个字节的最高位可以区分叶子节点和非叶子节点
-
纯文本键:实质上是一个B树,其中存储了一个指向记录的指针,以及每个字节在每个被索引列或列集中的相关权重
-
空间键:扩展的B树,称为R树,R代表地区,R树以包含所有给定节点元素下的子节点的界限框代替键值
参考资料:
1、《深入理解MySQL核心技术》第十章(235页)
2、简书
网友评论