Skip to content

MySQL体系架构

1. 数据库和数据库实例

所谓数据库就是物理操作系统文件或者其他形式文件类型的集合。
数据库实例就是由数据库后台进程/线程以及一个共享内存区组成,其中共享内存可以被运行的后台进程/线程所共享。数据库实例才是真正用来操作数据库文件(嵌入式数据库除外)。
MySQL数据库和MySQL数据库实例之间是一对一的关系,不像Oracle数据库支持一对多的关系。

2. MySQL的体系

  1. 单进程多线程: 和微软的SQLServer类似
  2. 插件式存储引擎架构
  3. 存储引擎的对象是表

3. MySQL总体架构

Alt text 大致可以分为连接层、服务层、引擎层、存储层四层结构。

3.1 连接层

包含TCP池和Thread池,处理来自客户端的连接,如用户名密码校验、权限校验等

3.2 服务层

服务层是MySQL Server的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。

  • SQL接口:
  • Parser(解析器): 先进行语法检查,通过后如果没有命中缓存,解析器会对SQL语句进行语法解析、语义解析、词法解析,生成语法树。
  • Optimizer(查询优化器): 核心组件,对SQL进行优化,根据执行计划和表统计信息,确定最优的查询执行方式,决策是否使用索引等来获取最优结果。
  • Caches & Buffers(缓存): 由一系列小缓存组成,如表(查询)缓存(show variables like '%query_cache_type%')、记录缓存、key缓存、权限缓存等

4. MySQL逻辑结构

Alt text MySQL数据库中数据库Database和Schema是同义词,一 一对应的。

5. MySQL的存储结构

Alt text 比较特殊的是information_schema数据库,它并没有出现在磁盘中,因为它存放在内存中,information_schema数据库是表结构元信息在内存中的映射。

6. 存储引擎

用来处理数据库的相关CRUD操作,MySQL的存储引擎目前主要使用InnoDB, 其他引擎如下: Alt text 查看当前MySQL实例内置的存储引擎:

sh
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster         | NO      | Clustered, fault-tolerant tables                               | NULL         | NULL | NULL       |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| ndbinfo            | NO      | MySQL Cluster system information storage engine                | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)

尽可能使用InnoDB存储引擎,其他存储引擎已经不再维护和开发。

6.1 存储引擎之MyISAM

MySQL5.1版本之前的默认存储引擎, 不支持事务, 数据容易丢失, 索引容易损坏, 数据库锁粒度是表锁。唯一的优点:数据文件可以直接拷贝到另一台服务器使用。

6.2 存储引擎之Memory

完全基于内存存储,数据库重新启动后数据丢失,不支持事务,数据库锁粒度是表锁。Memory存储引擎是不能禁用的,因为MySQL内部的排序操作的临时表使用该存储引擎。参数max heap table_size决定使用的大小,默认16M。

6.3 存储引擎之CSV

底层文件以纯文本形式使用CSV文件作为存储格式,内容使用逗号分割,数据不支持特殊字符。慢查询日志表里,使用的存储引擎就是CSV。

sh
mysql> show create table slow_log;
+----------+-----------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                  |
+----------+-----------------------------------------------------------------------------------------------+
| slow_log | CREATE TABLE `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int NOT NULL,
  `rows_examined` int NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int NOT NULL,
  `insert_id` int NOT NULL,
  `server_id` int unsigned NOT NULL,
  `sql_text` mediumblob NOT NULL,
  `thread_id` bigint unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COMMENT='Slow log' |
+----------+-----------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

6.4 存储引擎之InnoDB

修改表的存储引擎:

sql
alter table 表名 engine=innodb;