MySQL 的体系结构和通信机制

摘要:什么是数据库和数据库实例,有什么区别?mysql 的服务器 / 客户端通信协议是“半双工”的,要么服务器向客户端发送数据,要么客户端向服务器发送数据。mysql 的体系结构可以分为四层,网络连接层,服务层,存储引擎层,物理文件层。

数据库和数据库实例

数据库(database):物理操作文件系统或其他形式文件类型的集合,在 mysql 文件中,数据库文件可以是 frm、MYD、MYI、ibd 结尾的文件,其实说白了就是数据存储的物理文件。

实例(instance):mysql 数据库后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。

数据库和数据库实例是一一对应的,一个数据库对应一个数据库实例,但是在集群的情况下可能存在一个数据库被多个实例使用的情况。

mysql 是一个单进程多线程架构的数据库,这也就是说,mysql 数据库实例在系统上的表现就是一个进程。

[root@localhost ~]# ps -ef | grep mysqld
root       958     1  0 5月06 ?       00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/localhost.pid
mysql     1492   958  0 5月06 ?       00:02:51 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/var/localhost.pid --socket=/tmp/mysql.sock --port=3306
root     13983  1957  0 19:43 pts/0    00:00:00 grep --color=auto mysqld

注意上面的 1492 进程号,该进程就是 mysql 实例。当启动实例时,mysql 启动的时候会去读取配置文件,然后根据配置文件的参数来启动数据库实例。如果没有配置文件,mysql 会按照编译时的默认参数设置启动实例。用以下命令可以查看当时 mysql 数据库实例启动时,会在哪些位置查找配置文件。

[root@localhost ~]# mysql --help| grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

可以看到 mysql 是按照 /etc/mysql/my.cnf -> /etc/my.cnf -> ~/.my.cnf 的顺序读取配置文件的。如果这几个配置文件中都有同一个参数,那么 mysql 会以最后一个配置文件中的参数为准。


客户端/服务端通信协议

mysql 客户端/服务端通信协议是“半双工”的:在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它。相当于两个人传球一样,在任何时刻,只能一个人拿球。由于两个动作不能同时发生,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。

客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置 max_allowed_packet 参数。但是需要注意的是,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用 select * 以及加上 limit 限制的原因之一。


MySQL 体系结构

从概念上说,数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合, 数据库实例是程序,是位于用户和操作系统之间的的一层数据管理软件。用户对数据库的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。

数据库是由一个个文件组成(一般来说是二进制文件)的,要对这些文件执行诸如 select、insert、update、delete 之类的数据库操作是不能通过简单的文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。

                                                      mysql 体系结构可以分为四层

网络连接层:
    连接管理、授权认证、安全等等。

服务层:
    mysql 的核心服务大部分都在这一层,比如查询缓存、查询解析、查询优化器、生成执行计划,执行 sql、存储过程、触发器等等。
    所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。

存储引擎层:
    存储引擎负责数据的存储和提取。每种存储引擎都有其优势和劣势。中间的服务层通过 api 与存储引擎通信,这些 api 接口屏蔽了不同存储引擎间的差异。
    mysql 采用插件式的存储引擎。mysql 为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。

物理文件层:
    数据库的数据都存在文件系统之上,并完成和存储引擎的交互。

从四层结构中还可以发现 mysql 由 连接池组件、管理服务和工具组件、sql 接口组件(sql interface)、查询分析器(parser)、优化器组件(optImizer)、缓冲组件(cache & buffer)、插件式存储引擎(pluggable storage engines)、物理文件 (file sysgtem & logs)组成。mysql 数据库区别于其它数据库的最重要的一个特点就是其插件式的存储引擎。

需要特别注意的是,存储引擎是基于表的,而不是数据库的。


参考资料:

《MySQL 技术内幕 InnoDB 存储引擎》第一章 1.1 1.2

【MySQL】漫谈MySQL体系结构

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top