MySQL体系架构
1. 数据库和数据库实例
所谓数据库就是物理操作系统文件或者其他形式文件类型的集合。
数据库实例就是由数据库后台进程/线程以及一个共享内存区组成,其中共享内存可以被运行的后台进程/线程所共享。数据库实例才是真正用来操作数据库文件(嵌入式数据库除外)。
MySQL数据库和MySQL数据库实例之间是一对一的关系,不像Oracle数据库支持一对多的关系。
2. MySQL的体系
- 单进程多线程: 和微软的SQLServer类似
- 插件式存储引擎架构
- 存储引擎的对象是表
3. MySQL总体架构
大致可以分为连接层、服务层、引擎层、存储层四层结构。
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逻辑结构
MySQL数据库中数据库Database和Schema是同义词,一 一对应的。
5. MySQL的存储结构
比较特殊的是information_schema数据库,它并没有出现在磁盘中,因为它存放在内存中,information_schema数据库是表结构元信息在内存中的映射。
6. 存储引擎
用来处理数据库的相关CRUD操作,MySQL的存储引擎目前主要使用InnoDB, 其他引擎如下: 查看当前MySQL实例内置的存储引擎:
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。
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
修改表的存储引擎:
alter table 表名 engine=innodb;