MySQL整体架构

与所有服务端软件一样,MySQL采用的也是C/S架构,即客户端(Client)与服务端(Server)架构,我们在使用MySQL的时候,都是以客户端的身份,发送请求连接到运行服务端的MySQL守护进程,而MySQL服务器端则根据我们的请求进行处理并把处理后的结果返回给我们,这个过程可以简单地抽像成下面的示意图:

客户端(Client)

在安装后MySQL之后,在其安装目录的bin目录下,有一个mysql命令,这就是一般我们所说的MySQL客户端,不过这是MySQL官方提供的命令行客户端。

在shell输入mysql命令,便可以开始连接MySQL服务器了,如下:

$ mysql -u root -p
Enter password:*******

输入密码之后,便进入如下所示的MySQL客户端交互界面:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 5.7.29-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

上面的箭头表示等待输入,这就是说,我们可以发MySQL服务器发送各种语句了。

输入\q,exit,quit则可以退出客户端,如:

mysql>exit
Bye

除了MySQL原生的命令行客户端,其实更常用的还有一些GUI客户端,比如我们比较用的Navicat,另外还有各种编程语言提供的访问MySQL的类库,其实都是连接到MySQL的客户端。

服务端(Server)

上面的示意图可能太过于抽象和简单,再深入到MySQL服务器的内部,我们可以使用下面的示意更加详尽地描述整个MySQL的逻辑架构:

MySQL架构逻辑图(自己画的哦)

我们所说的MySQL其实更多的时候是指MySQL服务端,MySQL服务端是负责响应客户端请求的守护进程。

在MySQL安装目录下运行下面的命令便可以启动MySQL服务器守护进程,不过一般我们不采用这种方式,而是使用系统服务的方式启动MySQL守护进程。

$ bin/mysqld

从上面的示意图可以看出来,MySQL的服务端大体上可以分为Server层和存储引擎层,而Server层分别为连接管理、解析与优化、查询优化器和执行器,而Server层与存储引擎之间的交互则通过统一的API进行调用,下面我们来详细了解MySQL Server的各个组件的功能与作用。

连接管理器

连接管理器的作用是管理和维持所有MySQL客户端的请求连接,当我们向MySQL发起请求时,连接管理器会负责创建连接并校验用户的权限。

对于已经建立的连接,如果没有太久没有发送请求,连接管理器会自动断开连接,我们可以通过设置变量wait_timeout决定多久断开不活跃的连接。

查询缓存

当我们与连接器建立连接后,如果我们执行的是SELECT语句,那么连接器会先从查询缓存中查询,看看之前是否执行过这条语句,如果没有再往走,如果有则判断相应的权限,符合权限,则直接返回结果。

查询缓存其实是把查询语句当作一个key,查询结果当用value,建立起来的key-value缓存结构。

不过,当数据表的数据发生变化时,其所对应的查询缓存则会失败,因此很多时候往往不能命中查询缓存,所以一般建议不要使用查询缓存。

mysql> select SQL_CACHE * from users where uid = 1000;

可能MySQL官方团队也意识到查询缓存的作用不大,在MySQL 8.0版本中已经将查询缓存的整块功能删掉了,所以如果你用的是MySQL 8.0的版本,查询缓存的功能就不存在了。

解析器

当在查询缓存中没有命令查询时,则需要真正执行语句,这时候就交给解析器先进行词法分析,对我们输入的语句进行拆解,折解后再进行语法分析,判断我们输入的语句是不是符合MySQL的语法规则,如果输入的语句不符合MySQL语法规则,则停止执行并提示错误。

比如我们输入下面的错误语句:

select * users

由于上面的语句少了from,所以会返回下面的错误提示:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'users' at line 1

查询优化器

我们输入的语句,经过分析器的词法和语法分析,MySQL服务器已经知道我们要查询什么了,不过,在开始查询前,还要交由查询优化器进行优化。

在优化的过程,优化器会根据SQL语句的查询条件决定使用哪一个索引,如果有连接(join),会决定表的查询顺序,最终会根据优化的结果生成一个执行计划交由下面的执行器去执行。

执行器

SQL语句在经过查询优化器的优化后,接下来就交由执行器开始执行,不过执行器在开始执行前,会判断用户对相应的数据表是否有权限。

如果用户有权限,则开始调用数据,与其数据库不同的,MySQL的数据存储与调用交由存储实现,当我们调用时,执行器通过存储引擎API向底层的存储发送相应的指令,存储引擎负责具体执行,并将执行结果告诉执行器,然后再返回给客户端。

存储引擎

存储引擎,也叫做表类型,其具体作用便是决定一个数据表怎么处理和存储表中的数据,MySQL支持多种不同的存储引擎,而且存储引擎被设计为可插拔式的,在同一个数据库中,不同的数据表可以使用不同的存储引擎。

Innodb是MySQL的默认存储引擎,也是常用的存储引擎,另外比较常用的存储引擎还有MyISAM和Momery。

查询支持的存储引擎

在连接到MySQL服务端之后,我们可以使用下面的命令查询当前MySQL服务器支持的存储引擎:

mysql > show engines

上面语句的执行结果,如下表所示:

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

从上面的表格中,可以看出我本地的MySQL支持9种存储引擎,上面表格中,Engine列显示的是存储引擎的名称,Support列说明该引擎是否可用,DEFAULT则说明该引擎为默认引擎,Comment是该引擎的说明,Transactions列用于说明存储引擎是否支持事务,XA列说明该存储引擎是否支持分布事务,Savepoints列说明存储引擎是否支持部分事务回滚。

指定存储引擎

Innodb是MySQL的默认存储引擎,这意味着,如果你在创建数据表的时候没有指定存储引擎,则默认使用Innodb,而下面的语句,则演示了在创建数据表时,重新指定存储引擎,如下面的users数据表,我们使用了MyISAM存储引擎。

mysql> CREATE TABLE users(
-> uid int not null,
-> username varchar(32) not null,
-> email varchar(64) not null,
-> gender tinyint not null,
-> primary key(uid)
-> )engine=MyISAM
-> ;

修改表的存储引擎

对于已经创建好的数据,也可以通过下面的语句修改其存储引擎:

ALTER TALBE 数据表名称 ENGINE=存储引擎的名称

比如我们把users表的存储引擎从MyISAM改为InnoDB

ALTER TABLE users ENGINE=InnoDB;

小结

“不畏浮云遮望眼,自缘身在最高层”,对MySQL基础架构的学习与了解,让我们可以站在最高处,有助于我们鸟瞰MySQL的全貌,了解MySQL的整体运行情况,让我们可以从全局思考如何解决问题,而不是局限于某个方面。

MySQL系列(一):谈谈MySQL架构的更多相关文章

  1. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  2. mysql系列之6.mysql主从同步

    普通文件的数据同步 nfs: 网络文件共享 samba: 共享数据 定时任务或守护进程结合 rsync.scp inotify(sersync)+rsync 触发式实时数据同步 ftp数据同步 ssh ...

  3. mysql系列之2.mysql多实例

    使用场景 资金紧张; 并发访问不大; 门户网站; 实现 生产硬件配置: mem 32G / 双cpu 8核 / 磁盘6*600G sas 15k, 2-3个实例 安装组件 #yum install n ...

  4. mysql系列之4.mysql字符集

    针对mysql语句的临时办法: 先查看下mysql的各种编码设置情况, 如果结果显示有几项的编码不一致, 请先调整linux的系统编码 mysql> show variables like 'c ...

  5. mysql系列之7.mysql读写分离

    准备 下载如下linux安装包 jdk-6u31-linux-x64-rpm.bin amoeba-mysql-binary-2.2.0.tar.gz # crontab -e  //同步时间 */ ...

  6. mysql系列之8.mysql高可用 (mha4mysql)

    环境: 三台机器 主服务器: 192.168.1.130 主备机器: 192.168.1.131 监控机器: 192.168.1.132 130和131, 是mysql双主架构 1.在三台机器上安装m ...

  7. mysql系列之8.mysql高可用 (keepalived)

    环境: centos6.5_x64 准备: 两台mysql机器 主1 master:  192.168.32.130 主2 backup:  192.168.32.131 VIP: 192.168.3 ...

  8. mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化

    可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...

  9. mysql系列十、mysql索引结构的实现B+树/B-树原理

    一.MySQL索引原理 1.索引背景 生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的 ...

  10. mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)

    一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...

随机推荐

  1. 命令行开启WIFI

    netsh wlan set hostednetwork allow   //netsh wlan set hostednetwork mode=disallow netsh wlan set hos ...

  2. Java集合XMind与注意事项

    Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...

  3. POJ_2941_矩阵

    题目描述: 每组数据给定一个n*n的矩阵,选定不同行不同列的n个元素,求和,若所有选法所产生的和相等,则输出 homogeneous,否则输出not homogeneous. 描述: 数据挺大,爆搜肯 ...

  4. Go语言实现:【剑指offer】构建乘积数组

    该题目来源于牛客网<剑指offer>专题. 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0] * A[1] * - * A[i ...

  5. c++ 中全局/静态存储区的内存污染问题

    今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题. 看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题. 先看代码 #pragma once #pragma execut ...

  6. 新的征程TestOps

    TestOps 概念是什么时候提出来的没有去考察,知道TestOps测试运维是在DevOps这个概念下抽象的结果. DevOps,现在几乎每家公司都在谈DevOps,都已经实施,在实施,或者在准备实施 ...

  7. 手把手教你Dubbo与SpringBoot常用两种方式整合

    一.Dubbo整合SpringBoot的方式(1) 1)直奔主题,方式一: pom.xml中引入dubbo-starter依赖,在application.properties配置属性,使用@Servi ...

  8. SpringBoot配置文件的加载优先级顺序

    application.properties加载 Spring Boot启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot ...

  9. DFS判断图是否有环

      利用_DFS_来判断无向图是否存在环的条件思路,我看一次_DFS_是否能访问到之前访问到的节点,如果能够访问到,就说明图存在环,那么关键问题就是判断是一次DFS?,追根到_DFS_算法的实现细节, ...

  10. TCP加速方式

    使用windows scaling TCP Extensions for High Performance, RFC1323,https://www.ietf.org/rfc/rfc1323.txt ...