1. MySQL 体系结构
1.1. MySQL 体系结构
MySQL Client/Server 模型
MySQL 安装具有以下必需的体系结构组件: MySQL Server 、 Client 程序以及 MySQL 非 Client 程序。中央程序充当 Server , Client 程序连接到该 Server 以发出数据请求。 MySQL Client/Server 通信并不仅限于所有计算机都运行同一操作系统的环境。
l Client 程序可以连接到在相同主机或不同主机上运行的 Server 。
l Client/Server 通信可以发生在计算机运行不同操作系统的环境中。
1.2. MySQL Client 程序
Client 程序可以连接到 MySQL Server ,并检索、修改、添加或删除数据。常用的 Client 程序如下:
mysql :发出查询以及查看结果。
mysqladmin :管理 Server 。
mysqlcheck :检查数据库表的完整性。
mysqldump : 创建逻辑备份。
mysqlimport :导入文本数据文件。
mysqlshow :显示数据库、表和列信息。
mysqlslap :模仿 Client 负载。
这些程序通过命令解释器的提示符执行:
shell> mysql [options]
mysql Client 程序通常称为命令行界面 (command-line interface, CLI) 。
另外, MySQL Workbench 是一款 GUI 工具,使用该工具可进行数据库管理,例如,为数据库建模、执行数据库查询、执行管理任务
1.3. MySQL 管理程序和实用程序
MySQL 管理程序和实用程序可以直接访问数据文件,而无需使用 Client 连接到 Server 。常用非 Client 程序如下:
Ø innochecksum : offline 检查 InnoDB 表空间文件。
Ø mysqlaccess :检查主机名、用户名和数据库组合的访问权限的脚本
Ø mysqldumpslow :读取和汇总慢速查询日志内容的实用程序。
Ø mysqlbinlog :显示二进制日志文件。用于从二进制日志中读取语句的实用程序。
Ø myisam_ftdump :在 MyISAM 表中显示全文索引信息的实用程序。
Ø myisamchk :用于描述、检查、优化和修复 MyISAM 表的实用程序。
Ø myisamlog :处理 MyISAM 日志文件内容的实用程序。
Ø myisampack :压缩 MyISAM 表以生成更小的只读表的实用程序。
Ø mysql_config_editor :使您能够将身份验证凭据存储在名为 .mylogin.cnf 的安全加密登录路径文件中。
Ø mysqlhotcopy : 在服务器运行时快速备份 MyISAM 表的实用程序。 5.7 后废弃
Ø mysql_convert_table_format : 将数据库中的表转换为使用给定存储引擎的实用程序。
Ø mysql_find_rows : 读取包含 SQL 语句的文件 ( 如更新日志 ) 并提取与给定正则表达式匹配的语句的实用程序。
Ø mysql_fix_extensions : 将 MyISAM 表文件的扩展名转换为小写的实用程序。在将文件从具有大小写不敏感文件名的系统传输到具有大小写敏感文件名的系统之后,这将非常有用。
Ø mysql_setpermission :用于交互式地设置 MySQL 授予表中的权限的实用程序。
Ø mysql_waitpid :使用给定进程 ID 杀进程的实用程序。
Ø mysql_zap :使用模式匹配的方式杀进程的实用程序。
以上某些应用程序在运行之前必须满足:关闭 Server 或者备份当前表的条件,建议在执行这些程序前查看相关要求。
1.4. MySQL Server
MySQL Server 是一个名为 mysqld 的数据库程序,它与“ host ”不相同 , 是一个单一进程,且为多线程 , 可以管理磁盘和内存中数据库的访问,支持并发 Client 连接,支持多种存储引擎,支持事务表和非事务表。
Server 和 Host 之间的差别:
l Server :一个软件程序 (mysqld) ,具有版本号和一系列功能
l Host : Server 程序在其上运行的物理计算机,其中包含硬件配置、操作系统、网络地址 , 多个 mysqld 实例可同时在一台主机上运行。
mysqld ( Server 程序)进程可以划分为以下三个层:
l 连接层:处理连接。此层存在于所有 Server 软件( Web/ 邮件 /LDAP Server )上。
l SQL 层:处理所连接的应用程序发送的 SQL 查询。
l 存储层:处理数据存储。数据可以按不同格式和结构存储在不同物理介质上。
1.4.1 连接层
连接层可通过多种通信协议接受来自应用程序的连接:
² TCP/IP
² UNIX 套接字
² 共享内存
² 命名管道
TCP/IP 适用于整个网络。 Client 和 Server 在同一台计算机上运行时,上面列出的其他协议仅支持本地连接。此层针对每个连接维护一个线程。此线程处理查询执行。在某个连接可以开始发送 SQL 查询之前,将会通过验证用户名 + 口令 + Client 主机来对该连接进行验证。
通信协议在 Client 库和驱动程序中实现 , 连接协议的速度随本地设置不同而不同。
l TCP/IP ( Transmission Control Protocol/InternetProtocol ):该通信协议套件用于连接 Internet 上的主机。在 Linux 操作系统中, TCP/IP 是内置的,供 Internet 使用,从而使其成为通过网络传输数据的标准。这是适用于 Windows 的佳连接类型。
l UNIX 套接字 :一种进程间通信形式,用于在同一台计算机上的进程之间形成双向通信链路的一端。套接字需要本地系统上的物理文件。这是适用于 Linux 的佳连接类型。
l 共享内存 :一种在程序之间传递数据的有效方式。一个程序创建其他进程(如果允许)可以访问的内存部分。此 Windows 显式“被动”模式仅适用于单台 (Windows) 计算机。默认情况下,共享内存处于禁用状态。要启用共享内存连接,必须使用 --shared-memory 选项启动 Server 。
l 命名管道 :命名管道的使用偏向于 Client/Server 通信,其工作方式与套接字非常相似。命名管道支持读 / 写操作,以及 Server 应用程序的显式“被动”模式。此协议仅适用于单台 (Windows) 计算机。默认情况下,命名管道处于禁用状态。要启用命名管道连接,必须使用 --enable-named-pipe 选项启动 Server 。
1.4.2 SQL 层
建立连接后, MySQL Server 将处理以下进程:
l 授权和解析器 :解析器验证语法是否正确,然后,授权验证是否允许所连接的用户运行特定查询。
l 优化器 :创建每个查询的执行计划,这是有关如何以优化的方式执行查询的分步指令集。确定要使用哪些索引以及采用何种顺序处理表是此步骤的重要部分。
l 查询执行 :完成每个查询的执行计划。
l 查询高速缓存 :(可选)可配置的查询高速缓存,可用于存储(并立即返回)执行的查询和结果。
l 查询日志记录 :可以启用以跟踪执行的查询。
SQL 语句处理流程图如:
1.4.3 存储层
通过 MySQL ,您可以使用称为“存储引擎”的不同类型的存储。数据可以存储在磁盘、内存和网络中。数据库中的每个表可以使用任何可用的存储引擎。“磁盘”存储便宜且持久,而“内存”存储则要快得多。
InnoDB 是默认存储引擎。它可提供事务、全文索引和外键约束,因此适用于各种混合查询。它具有多种用途,支持读密集型工作负荷、读 / 写工作负荷和事务工作负荷。其他存储引擎包括:
MyISAM :适用于频繁读取但很少更新的数据
MEMORY :在内存中存储所有数据
NDB :供 MySQL Cluster 用来为高可用性数据提供冗余的可伸缩拓扑
注:存储引擎可扩展,超越存储层,而不只包含存储。它们还包括其他结构和实现机制。
1) 存储引擎:概览
存储引擎是充当不同表类型的处理程序的 Server 组件。存储引擎用于存储数据、检索数据、通过索引查找数据;
Client 通过以 SQL 语句形式向 Server 发送请求从表中检索数据或更改表中的数据。服务器通过使用双层处理(上层包括 SQL 解析器和优化器、下层包含一组存储引擎)模型执行每条语句。
Client 通常不需要关心哪些引擎参与 SQL 语句处理。 Client 可以使用相同的语句(不管哪个引擎管理它们)访问和处理表。这种独立于引擎的 SQL 语句的一些例外情况包括:
l CREATE TABLE 具有 ENGINE 选项,可基于每个表指定要使用的引擎。
l ALTER TABLE 具有 ENGINE 选项,允许将表转换为使用不同的存储引擎。
l 某些索引类型仅适用于特定存储引擎。例如,仅 InnoDB 和 MyISAM 引擎支持全文索引。
l COMMIT 和 ROLLBACK 操作仅影响事务存储引擎(例如 InnoDB 和 NDB )管理的表。
2) 依赖于存储引擎的功能
以下属性依赖于存储引擎:
l 存储介质:表存储引擎可以在磁盘上、在内存中或通过网络存储数据。
l 事务功能:某些存储引擎支持全面的 ACID 事务功能,而其他存储引擎可能不具有事务支持。注:“事务与 Lock ”一课中讨论了 ACID 。
l Lock :存储引擎可能使用不同的 Lock 粒度(例如表级别 Lock 或行级别 Lock )和机制来提供与并发事务的一致性。
l 备份和恢复:可能会受到存储引擎存储和操作数据的方式的影响。
l 优化:不同的索引实现可能会影响优化。存储引擎以不同的方式使用内部高速缓存、缓冲区和内存以优化性能。
l 特殊功能:某些引擎类型具有提供全文搜索和引用完整性的功能以及处理空间数据的能力。
优化器可能需要根据存储引擎进行不同的选择,但这均是通过每种存储引擎支持的标准化接口 (API) 进行处理的。
3) MySQL 如何使用磁盘空间
程序文件随数据目录一起存储在 Server 安装目录下。执行各种 Client 程序、管理程序和实用程序时将创建程序可执行文件和日志文件。首要使用磁盘空间的是数据目录。
l Server 日志文件和状态文件包含有关 Server 处理的语句的信息。日志可用于进行故障排除、监视、复制和恢复。
l InnoDB 日志文件(适用于所有数据库)驻留在数据目录级别。
l InnoDB 系统表空间包含数据字典、撤消日志和缓冲区。
l 每个数据库在数据目录下均具有单一目录(无论在数据库中创建何种类型的表)。数据库目录存储以下内容:
- 数据文件:特定于存储引擎的数据文件。这些文件也可能包含元数据或索引信息,具体取决于所使用的存储引擎。
- 格式文件 (.frm) :包含每个表和 / 或视图结构的说明,位于相应的数据库目录中。
- 触发器:与某个表关联并在该表发生特定事件时激活的命名数据库对象。
l 数据目录的位置取决于配置、操作系统、安装包和分发。典型位置是 /var/lib/mysql 。
l MySQL 在磁盘上存储系统数据库 (mysql) 。 mysql 包含诸如用户、权限、插件、帮助列表、事件、时区实现和存储例程之类的信息。
1.5. MySQL 如何使用内存
内存分配可以划分为以下两种类别:
全局 (每实例内存): Server 启动时分配一次并在 Server 关闭时释放。此内存在所有会话间共享。当所有物理内存用尽时,操作系统开始交换。这会对 MySQL Server 性能具有不利影响,可能会导致 Server 崩溃。
会话 (每会话内存):基于每个会话(有时称为“线程”)动态进行分配。此内存可在会话结束时或不再需要会话时释放。此内存多用于处理查询结果。所使用的缓冲区大小基于每个连接。例如, read_buffer 为 10 MB 且具有 100 个连接意味着可能总共有 100*10 MB 同时用于所有读取缓冲区。
Server 以三种不同的类别分配内存:
Server 在运行时会为许多种类的数据分配内存。
线程高速缓存 :在 MySQL (和其他程序)中使用线程将应用程序执行划分为两个或更多个同时运行的任务。将会为连接到 MySQL Server 的每个 Client 创建单独的线程以处理该连接。
缓冲区和高速缓存 :缓冲区和高速缓存提供数据管理子系统并支持快速访问项目,例如授权表缓冲区、存储引擎缓冲区(如 InnoDB 的日志缓冲区)和保存开放表说明符的表开放缓冲区。查询高速缓存还用于加速处理重复发出的查询。
如果使用 MEMORY 存储引擎, MySQL 将使用主内存作为主体数据存储。其他存储引擎也可能使用主内存进行数据存储,但 MEMORY 是的,未设计为在磁盘上存储数据。
连接 / 会话
内部临时表 :在某些查询执行情况下, MySQL 会创建一个临时表来解析查询。可以在内存中或在磁盘上创建临时表,具体取决于其大小或内容或者查询语法。
特定于 Client 的缓冲区 :专门设计为支持所连接的各个 Client 。缓冲区示例包括:
- 用于交换信息的通信缓冲区
- 表读取缓冲区(包括支持联接的缓冲区)
- 排序操作
1.6. MySQL 插件接口
插件接口需要 mysql 数据库中的 PLUGINS 表。此表是在 MySQL 安装过程中创建的。 MySQL 既支持 Client 插件也支持 Server 插件。守护进程插件启动在 Server 内运行的后台进程(例如,定期执行心跳处理)。
使用插件 API 可以装入和卸载 Server 组件:
– 支持动态装入,无需重新启动 Server
– 支持全文解析器;可用于替换或扩充内置全文解析器的全文解析器插件。例如,某个插件可以使用不同于内置解析器所使用的规则将文本解析为字。要解析具有不同于内置解析器所预期的特征的文本,这很有用。
– 支持不同的验证方法
– 支持作为插件安装的存储引擎;向 Server 提供低级别存储、检索和数据索引的存储引擎
– 支持 INFORMATION_SCHEMA 插件;信息模式插件作为 INFORMATION_SCHEMA 数据库中的表出现。