01 MySQL体系架构
1. 数据库与实例
在学习mysql之前,我们要先对数据库有个大致的理解。
计算机专业的我们常常听到数据库,那么数据库是什么呢?
可能我们第一反应是存储数据的,但那是从应用层面上来说的。如果要从物理层面来解释,数据库究竟是什么呢?
数据库领域有两个重要的术语:数据库和实例
数据库(database)
物理操作系统文件或其他形式文件类型的集合。
实例(instance)
由后台进程和内存结构组成。内存结构(又称共享内存区)可以被允许的后台线程所共享。
通俗的说起来就是:
数据库是用来长久存储数据的,而内存只能临时存储,磁盘等才能真正存储数据。所以数据库肯定是存放在磁盘上的,简单的说数据库就是磁盘上的一个文件。
那我们要怎么使用数据库呢?
如果我们可以直接使用数据库,那就等价于直接使用磁盘上的文件,显然是需要一些中间过程的。
即我们必须把磁盘上的文件读入内存才能使用,数据库同理。
数据库如何写入内存呢?
这个时候,就需要上面提到的实例了,实例就是内存结构以及一组后台进程。
实际上,正常的数据库读入内存的过程是:由实例中一组后台进程从磁盘上将数据文件读入到共享内存中,实例中的一个或多个后台进程可以对内存中的数据文件进行操作,再经过一组后台进程写到磁盘上的数据库中。
《MySQL技术内幕 InnoDB存储引擎 第2版》一书中这么介绍:
数据库是文件的集合,是以找某种数据模型组织起来并存放于二级存储器中的数据集合;数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对于数据库的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能与数据库打交道。即是说数据库实例才是真正用于操作数据库文件的。
以上提到的数据库是狭义上的数据库。
再来看Oracle中国官网对数据库的定义:
数据库是结构化信息或数据(一般以电子形式存储在计算机系统中)的有组织的集合,通常由数据库管理系统 (DBMS) 来控制。在现实中,数据、DBMS 及关联应用一起被称为数据库系统,通常简称为数据库。
以上为广义数据库的定义。我们学习的MySQL符合Oracle对广义数据库的解释,同时是一个C/S架构,下文将更为详细地介绍。
2. MySQL数据库
2.1 概述
在MySQL数据库中,实例与数据库的关系通常是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。但是在集群情况下,可能存在一个数据库被多个实例使用的情况。
多个“实例”同时驱动一个“数据库”的架构叫“集群(Oracle real application clusters,简称RAC)”。举个例子,如果把数据库比作一架飞机,实例就是飞机的发动机。那么,一台发动机可以驱动飞机,两台发动机也可以同时驱动一架飞机。
MySQL被设计为一个单进程多线程架构的数据库,这点与SQL Server比较类似,但与Oracle多进程的架构有所不同(Oracle的Windws版本也是单进程多线程架构)。MySQL数据库实例在系统的表现上就是一个进程。
而MySQL最重要、最与众不同的特性是它可拔插式的存储引擎架构将查询处理及其他系统任务和数据的存储/提取相分离。
2.2 体系结构
从上图中可以直观的看到MySQL是C/S架构,分为三层:
-
应用层(网络连接层)
- 连接处理
- 用户鉴权
- 安全管理
-
服务层
提供核心服务功能、跨存储引擎功能,包括:- 查询解析
- 分析
- 优化
- 缓存
- 存储过程
- 触发器
- 视图
-
存储引擎层
存储、提取数据
存储引擎不会解析SQL(除了InnoDB可以解析外键定义),服务器通过API与存储引擎进行通信,而这些存储引擎只负责简单的响应上层服务器的请求。
- 数据存储层
主要把数据存储在允许于该设备的文件系统之上,并完成于存储引擎的交互。
Q:一条SQL语句在MySQL中如何执行?
A:客户端请求—>连接器(验证用户身份,给予权限) —> 查询缓存(存在缓存则直接返回,不存在则执行后续操作) —> 分析器(对SQL进行词法分析和语法分析操作) —> 优化器(主要对执行的sql优化选择最优的执行方案方法) —> 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口) —> 去引擎层获取数据返回
2.3 存储引擎
由于MySQL的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎,因此市面上也有很多种存储引擎,好处是可以根据具体的应用建立更合适的存储引擎表。
主要流行的有四种,后续MySQL篇会常常涉及InnoDB,这里仅简单列举这四种存储引擎的主要特色:
- InnoDB
- 支持事务
- 行锁
- 外键
- 多版本并发控制(MVCC)
- 聚集存储
- 主要面向OLTP(在线事务处理)的引用
- MyISAM
- 表锁
- 支持全文索引
- 只缓存索引
- 不缓存数据
- 面向OLAP(联机分析处理)的应用
- Memory
- 默认哈希索引
- 表锁
- NDB
- 集群
- 高可用、高性能
参考资料:
《高性能MySQL》- 第3版 Baron Schwartz等著
《MySQL技术内幕 InnoDB存储引擎》 -第2版 姜承尧著
https://www.cnblogs.com/zzdbullet/p/10931843.html
https://www.oracle.com/cn/database/what-is-database/