MySQL:InnoDB存储引擎
参考资料
《MySQL技术内幕 InnoDB存储引擎》(第2版)
一、MySQL体系结构和存储引擎
1.1 MySQL体系结构
1. 概念辨析
从概念上来说:
- 数据库(database):数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;
- 数据库实例(instance):数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
直白地讲:
数据库是由一个个文件组成(一般是二进制文件)的,要对这些文件执行如SELECT、INSERT、UPDATE和DELETE等数据库操作是不能通过简单的操作文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。
因此简单地把Oracle、SQL Server、MySQL理解成数据库是有失偏颇的,虽然在实际使用时并不需要强调数据库与实例的区别。
2. MySQL数据库体系结构
MySQL由以下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插件式存储引擎
- 物理文件
MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎,插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必须的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿进行开发。
注意:存储引擎是基于表的,而不是数据库。
3. MySQL存储引擎
(1)InnoDB
-
支持事务,面向在线事务处理(OLTP)的应用;
-
特点:行锁设计、支持外键,支持类似于Oracle的非锁定读,即默认读取操作不产生锁;
-
从MySQL 5.5.8 开始,InnoDB是默认存储引擎;
-
InnoDB通过多版本并发控制(MVCC)来获得高并发性,实现了SQL四种隔离级别,默认为REPEATABLE(可重复读)级别;使用next-key locking的策略避免幻读;
-
对于表中的数据存储,InnoDB采用聚集的方式,每张表的存储按主键顺序进行存放,如果没有在表中显式定义主键,生成一个6字节的ROWID作为主键。
(2)MyISAM
- 不支持事务、表锁设计,支持全文索引,面向在线分析处理(OLAP)数据库应用;
- 缓冲池只缓存索引文件,不缓冲数据文件,这和大多数数据库不同;
- 表由MYD和MYI组成,MYD存储数据文件,MYI存放索引文件;
(3)NDB
- 是一个集群存储引擎,类似于Oracle的RAC集群,但是Oracle RAC是share everything架构,NDB是share nothing集群架构,提供更高的可用性;
- 特点:数据全部放在内存中(MySQL5.1开始可以将非索引数据放在磁盘上),因此主键查询速度极快,并且可以通过添加NDB数据存储结点线性提高数据库性能,是高可用、高性能的集群系统;
- 缺点:NDB存储引擎的连接操作(JOIN)在MySQL数据库层完成,而不是在存储引擎层完成,因此需要巨大网络开销,查询速度很慢;
(4)Memory
- 之前成为HEAP,将表中数据存放在内存中,如果数据库重启或崩溃,数据消失;
- 非常适合存储临时数据的临时表;
- 默认使用哈希索引而不是B+ 树索引;
- 只支持表锁,并发性能差;
- 存储变长字段(varchar)时是按照定长字段(char)的方式进行的,浪费内存;
- MySQL使用Memory作为临时表存放查询的中间结果集,如果中间结果集大于Memory存储引擎表的容量或含有TEXT或BLOB列类型字段,MySQL将其转换到MyISAM存储引擎表而存放到磁盘中;但MyISAM不缓存数据文件,因此这是产生的临时表的性能对于查询会有损失。
4. 存储引擎对比
特点 | Myisam | BDB | Memory | InnoDB | Archive |
---|---|---|---|---|---|
存储限制 | 没有 | 没有 | 有 | 64TB | 没有 |
事务安全 | 支持 | 支持 | |||
锁机制 | 表锁 | 页锁 | 表锁 | 行锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | |||
索引缓存 | 支持 | 支持 | 支持 | ||
数据可压缩 | 支持 | 支持 | |||
空间使用 | 低 | 低 | N/A | 高 | 非常低 |
内存使用 | 低 | 低 | 中等 | 高 | 低 |
批量插入的速度 | 高 | 高 | 高 | 低 | 非常高 |
支持外键 | 支持 |
存储引擎之间不存在优劣性的差异&#