MySQL 体系结构
- 连接池组件
- 管理服务和工具组件
- SQL 接口组件:DML、DDL、视图、触发器…
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式存储引擎:MyISAM 、InnoDB 、NDB …
- 物理文件
需要注意的是,存储引擎是基于表的,而不是数据库。
InnoDB
行锁设计,支持事务和外键。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样有 InnoDB 自身进行管理。
InnoDB 通过使用 MVCC 来获得高并发性,并且实现了 SQL 的 4 种隔离级别,默认为 REPEATABLE 级别。这里需要注意的是,由于其使用了 next-key locking 的策略,在默认的隔离级别下就可以避免幻读的产生。此外还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。
对于表中的数据,InnoDB 存储引擎使用聚集的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式定义主键,InnoDB 会为每一行生成一个 6 字节的 ROWID 作为主键。
MyISAM
表锁设计,不支持事务,支持全文索引。
MyISAM 存储引擎表由 MYD 和 MYI 组成,前者用来存放数据文件,后者存放索引文件。
缓冲池只缓存索引文件,不缓存数据文件。
NDB
集群存储引擎。
数据全部存放在内存中,因此主键查找的速度极快。
NDB 的连接操作是在 MySQL 数据库层完成的,而不是在存储引擎完成的。--> 复杂的连接操作需要巨大的网络开销,因此查询速度慢。
Memory
表的数据存放在内存中。适合用于存储临时数据的临时表,以及数据仓库中的纬度表。默认使用哈希索引。
只支持表锁,不支持 TEXT 和 BLOB 列类型,varchar 按 char 存储,浪费内存空间。
如果中间结果集大于 Memory 存储引擎表的容量设置,或者中间结果含有 TEXT 和 BLOB ,MySQL 会将其转换到 MyISAM 存储引擎表。而由于 MyISAM 不缓存数据文件,因此临时表的性能对于查询会有损失。
Archive
只支持 INSERT 和 SELECT 操作。适合存储归档信息,如日志信息。
Maria
设计目标是取代原有的 MyISAM 。
支持缓存数据和索引文件,应用了行锁设计,提供了 MVCC 功能,支持事务。