庖丁解牛之MySQL体系结构

一、MySQL简介

1、MySQL是全球最普及的开源数据库,MySQL代表了Oracle所提供的同类产品中最出色的,面向基于web的应用程序数据库解决方案,是嵌入式数据库的不错选择。

2、MySQL连接器为客户机程序提供到MySQL服务器的连接,API提供对MySQL协议和MySQL资源的低级访问,使用连接器和API可以从另一语言或环境连接到MySQL并行MySQL语句。

mysql支持的第三方连接器包括:

PHP,Perl,Python,Ruby,C++包装

二、MySQL体系结构

1、MySQL数据库为C/S(客户机/服务器)模型

MySQL安装具有以下必需的体系结构组件:MySQL 服务器、客户机程序以及 MySQL 非客户机程序。中央程序充当服务器,客户机程序连接到该服务器以发出数据请求。MySQL 客户机/服务器通信并不仅限于所有计算机都运行同一操作系统的环境。客户机程序可以连接到在相同主机或不同主机上运行的服务器。客户机/服务器通信可以发生在计算机运行不同操作系统的环境中。

2、客户机程序

连接到MySQL服务器进行对数据的操作

3、MySQL服务器

是称为mysqld的数据库服务器程序,与主机不相同,是一个单一的进程,且为多线程。管理对磁盘上和内存中数据库的访问,支持并发客户机连接,支持多种存储引擎,支持事务和非事务表,使用缓存和缓冲形式的内存。

注意服务器和主机的区别:

服务器是一个软件程序mysqld,具有版本号和一系列功能

主机是服务器程运行的物理环境,包含有硬件配置,计算机操作系统,网络地址。

多个服务器mysqld可以在一台主机上运行。

4、mysqld(服务器程序)进程可以分为以下三层:

(1)连接层:处理连接,存在于服务器软件(Web/邮件/LDAP服务器)上

连接层可通过多种通信协议接受来自应用程序的连接,TCP/IP、UNIX套接字、共享内存、命名管道。TCP/IP 适用于整个网络。客户机和服务器在同一台计算机上运行时,上面列出的其他协议仅支持本地连接。此层针对每个连接维护一个线程。此线程处理查询执行。在某个连接可以开始发送 SQL 查询之前,将会通过验证用户名 + 口令 + 客户机主机来对该连接进行验证。

1)TCP/IP(传输控制协议/Internet 协议,Transmission Control Protocol/Internet Protocol):该通信协议套件用于连接 Internet 上的主机。在 Linux 操作系统中,TCP/IP 是内置的,供 Internet 使用,从而使其成为通过网络传输数据的标准。这是适用于 Windows 的最佳连接类型。

2)UNIX 套接字:一种进程间通信形式,用于在同一台计算机上的程之间形成双向通信链路的一端。套接字需要本地系统上的物理文件,这是适用于 Linux 的最佳连接类型。

3)共享内存:一种在程序之间传递数据的有效方式。一个程序创建其他进程(如果允许)可以访问的内存部分。此 Windows 显式“被动”模式仅适用于单台 (Windows) 计算机。默认情况下,共享内存处于禁用状态。要启用共享内存连接,必须使用--shared-memory 选项启动服务器。

4)命名管道:命名管道的使用偏向于客户机/服务器通信,其工作方式与套接字非常相似。命名管道支持读/写操作,以及服务器应用程序的显式“被动”模式。此协议仅适用于单台 (Windows) 计算机。默认情况下,命名管道处于禁用状态。要启用命名管道连接,必须使用 --enable-named-pipe 选项启动服务器。

(2)SQL层:处理连接的应用程序发送的SQL查询

建立连接后,MySQL服务器将处理以下进程:

1)授权和解析器:解析器验证语法是否正确,然后授权验证是否允许所连接的用户运行特定查询。

2)优化器:创建每个用户的执行计划,这是有关如何优化的分布式查询的分布指令集。确定要使用哪些索引以及采用何种顺序处理表是此步骤最重要的部分。

3)查询执行:完成每个查询的执行计划。

4)查询高速缓存:(可选)可配置的查询高速缓存,可用于存储(并立即返回)执行的查询和结果。

5)查询日志记录:可以启用跟踪执行的查询。

(3)存储层:处理数据存储,数据可按不同形式和结构存储在不同的物理介质上。

1)通过MySQL,你可以使用称为“引擎存储”的不同类型的存储类型。数据可以存储在磁盘,内存和网络中。数据库中每个表可以使用任何可用道德存储引擎。“磁盘”存储便宜且持久,而”内存“存储则要快得多。

2)InnoDB是默认的存储引擎。它可提供事务,全文索引和外键约束,因此适用于各种混合查询。它具有多种用途,支持读密集型工作负荷,读/写工作负荷和事务工作负荷。

3)其他存储引擎包括:

MyISAM:适用于频繁读取但很少更新的数据。

MEMORY:在内存中存储所有数据。

NDB:供MySQL Cluster用来为高可用性数据提供冗余的可伸缩拓扑,客户机通过以SQL语句形式向服务器发送请求从表中检索数据或更改表中数据。服务器通过使用双层处理模型执行每条语句。客户机通常不需要关心哪些引擎参与SQL语句处理,客户机可以使用相同的语句(不管哪个引擎管理他们)访问和处理表。

4)引擎的 SQL 语句的一些例外情况包括:

a:CREATE TABLE 具有 ENGINE 选项,可基于每个表指定要使用的引擎。

b: ALTER TABLE 具有 ENGINE 选项,允许将表转换为使用不同的存储引擎。

c:某些索引类型仅适用于特定存储引擎。例如,仅 InnoDB 和 MyISAM 引擎支持全文索引。

d:COMMIT 和 ROLLBACK 操作仅影响事务存储引擎(例如 InnoDB 和 NDB)管理的表。

5)以下属性依赖于存储引擎:

a:存储介质:表存储引擎可以在磁盘上、在内存中或通过网络存储数据。

b:事务功能:某些存储引擎支持全面的 ACID 事务功能,而其他存储引擎可能不具有事务支持。注:“事务与锁定”一课中讨论了 ACID。

c:锁定:存储引擎可能使用不同的锁定粒度(例如表级别锁定或行级别锁定)和机制来提供与并发事务的一致性。

d: 备份和恢复:可能会受到存储引擎存储和操作数据的方式的影响。

e: 优化:不同的索引实现可能会影响优化。存储引擎以不同的方式使用内部高速缓存、缓冲区和内存以优化性能。

f: 特殊功能:某些引擎类型具有提供全文搜索和引用完整性的功能以及处理空间数据的能力。

优化器可能需要根据存储引擎进行不同的选择,但这均是通过每种存储引擎支持的标准化接口 (API) 进行处理的

5、MySQL如何使用磁盘空间

程序文件随数据目录一起存储在服务器安装目录下。执行各种客户机程序、管理程序和实用程序时将创建程序可执行文件和日志文件。首要使用磁盘空间的是数据目录。

(1)服务器日志文件和状态文件包含有关服务器处理的语句的信息。日志可用于进行故障排除、监视、复制和恢复。

1)InnoDB 日志文件(适用于所有数据库)驻留在数据目录级别。

2)InnoDB 系统表空间包含数据字典、撤消日志和缓冲区。

3)每个数据库在数据目录下均具有单一目录(无论在数据库中创建何种类型的表)。

(2)数据库目录存储以下内容

1)数据文件:特定于存储引擎的数据文件。这些文件也可能包含元数据或索引信息,具体取决于所使用的存储引擎。

2)格式文件 (.frm):包含每个表和/或视图结构的说明,位于相应的数据库目录中。

3)触发器:与某个表关联并在该表发生特定事件时激活的命名数据库对象。

(3)数据目录的位置取决于配置、操作系统、安装包和分发。典型位置是/var/lib/mysql

7、MySQL如何使用内存

内存分配可以划分为以下两种类别:

(1)全局(每实例内存):服务器启动时分配一次并在服务器关闭时释放。此内存在所有会话间共享。当所有物理内存用尽时,操作系统开始交换。这会对 MySQL 服务器性能具有不利影响,可能会导致服务器崩溃。

(2)会话(每会话内存):基于每个会话(有时称为“线程”)动态进行分配。此内存可在会话结束时或不再需要会话时释放。此内存多用于处理查询结果。所使用的缓冲区大小基于每个连接。例如,read_buffer 为 10 MB 且具有 100 个连接意味着可能总共有 100*10 MB 同时用于所有读取缓冲区。

8、内存结构

服务器在运行时会为许多种类的数据分配内存。

(1)线程高速缓存:在 MySQL(和其他程序)中使用线程将应用程序执行划分为两个或更多个同时运行的任务。将会为连接到 MySQL 服务器的每个客户机创建单独的线程以处理该连接。

(2)缓冲区和高速缓存:缓冲区和高速缓存提供数据管理子系统并支持快速访问项目,例如授权表缓冲区、存储引擎缓冲区(如 InnoDB 的日志缓冲区)和保存开放表说明符的表开放缓冲区。查询高速缓存还用于加速处理重复发出的查询。如果使用 MEMORY 存储引擎,MySQL 将使用主内存作为主体数据存储。其他存储引擎也可能使用主内存进行数据存储,但 MEMORY 是唯一的,未设计为在磁盘上存储数据。

(3)内部临时表:在某些查询执行情况下,MySQL 会创建一个临时表来解析查询。可以在内存中或在磁盘上创建临时表,具体取决于其大小或内容或者查询语法。

(4)特定于客户机的缓冲区:专门设计为支持所连接的各个客户机。缓冲区示例包括:

1)用于交换信息的通信缓冲区

2)表读取缓冲区(包括支持联接的缓冲区)

3)排序操作

三、安装MySQL数据库

1、rpm在线安装,在可以访问互联网的情况下

(1)下载安装包

wget  http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

(2)安装rpm -ivh

(3)查看yum源 cd /etc/yum.repos.d

(4)修改文件

vim mysql-community.repo

(5)启动服务systemctl start mysql

2、rpm离线安装,在无法访问互联网的情况下。

3、免编译安装

(1)下载免编译安装包,可以到MySQL官网下载

(2)解压

(3)将文件截切到/usr/local/mysql并重命名为mysql

(4)我们在下载包的时候会自动创建用户mysql

(5)执行安装脚本并指定安装路径

./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/u01/data指定数据库基础路径以及文件安装路径

将服务拷贝到/etc/init.d/下,/etc/init.d是开机会加载的目录,将my-default.cnf拷贝到/etc/my.cnf并重命名为my.cnf方便管理。

(6)修改文件vim /etc/init.d/mysqld

(7)systemctl start mysql启动服务,ps aux|grep mysql查看服务是否启动

4、源码安装

源码安装三部曲:configure,make,make install

猜你喜欢

转载自blog.csdn.net/weixin_42774383/article/details/81697346