Mysql作为大多数中小型企业的首选数据库,也可能是众多同僚接触的第一个数据库,其热门程度不言而喻,一些相对基础的知识本系列不做赘述,主要简述Mysql相关的进阶知识。

本章将由浅入深的讲解从连接Mysql Server 到 执行第一条SELECT语句,这其中到底发生了什么。

首先我们看一张图

上图展示了Mysql客户端与服务端,当我们需要使用到数据库时,第一步,肯定是连接。

连接到Mysql Server

Mysql采用C/S模式构成整个技术架构,意味着Mysql定有一个服务端监听某个端口,等待着客户端的连接,这里可以引出一个问题,Mysql客户端使用何种方式进行连接?

1.TCP

2.unix socket协议

其中unix socket的方式,当你在Mysql Server端使用mysql命令进行连接时,会使用到Mysql Server服务器上的数据目录(可在Mysql客户端执行 show VARIABLES like 'data' 查看)下的mysql.sock文件进行连接,此处不多做赘述,如果有兴趣了解,可寻找相关资料。

除了unix socket协议, 客户端连接服务端,使用TCP协议进行连接,无论是Mysql Client GUI还是代码连接。

在引出一个问题,Mysql Client采用TCP的方式进行连接,那么是长连接还是短连接?

短连接需要频繁的建立连接,此方式对于数据库来说肯定是不合适,所以采用的是TCP 长连接,并且Mysql有一套专门的机制,可以使得TCP 长连接具有可回收特性,此处后续讲,此处不做赘述。

在引出一个问题,Mysql Client 连接采用TCP 长连接,是同步还是异步?

做一个实验:

在Mysql Client GUI (Mysql Workbench)中,执行一条SQL :SELECT * FROM member_info

可以明显的看到,当客户端命令发送到服务端后,客户端成阻塞状态,直到服务端返回数据后,客户端才可继续操作,并不是语句提交完毕,语句就结束了,此举是为了尽量避免在查询过程中,源数据发生变化导致结果不一致。

可能有朋友会怀疑这个阻塞状态是GUI的特性,实际上通过mysql提供的命令式程序查询,行为也是一样。

由此可得,Mysql Client 连接服务端,采用TCP 长连接 同步。

查询缓存组件

接下来我们再举一个例子:

member_info表大约存在2万数据,我们执行一段SQL:SELECT * FROM member_info

查询出全部数据,共耗时6.568秒

思考一个问题:当我第二执行同样的查询语句时,耗时是否会减少?

再次执行一次:SELECT * FROM member_info

可以得出,时间并没有减少,按理说,Mysql如此成熟的产品,一定会有一个叫做缓存的机制,用来缓存查询结果,提高后续查询的响应速度,但是从例子中看,是没有的。

实际上Mysql确实拥有缓存机制,只是默认是关闭的。

执行:show variables like 'query_cache%'

为什么Mysql默认关闭缓存,是因为要使用Mysql的缓存,需要满足一系列极为苛刻的条件,比如需要SQL语句完全一模一样等条件,具体的可以查阅相关资料,本文不做赘述。

而且Mysql官方本身也并不推荐大家使用此缓存机制。

由于以上原因,所以Mysql决定在8.0(含)开始,丢弃缓存部分。将此部分交给更加专业擅长的第三方。

本系列以Mysql 5.7为准

接下来补充一下一开始的图片。

解析器组件

举个例子,我们在GUI输入任意非SQL字符串执行:

可以看到Mysql Server 给客户端返回了一个语法错误的响应,为什么Mysql Server能够判断我的语句是否正确呢?

原因在于,Mysql Server拥有一个 解析器 的组件,此组件能够对你的SQL文本进行语法+词法分析,此部分详细的内容篇幅较大,有兴趣的朋友可以查阅相关资料,后续有

时间我也会另开文章进行说明。

至此,我们的图在更改一下:

本章先到此为止,明日继续更新下一章节,敬请期待。

Mysql架构与内部模块-第一章的更多相关文章

  1. Mysql架构与内部模块-第二章

    接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续. 先来看一段SQL:SELECT * FROM `jianghuadong`; 先假设我们数据库中并没有一张名为jianghuadon ...

  2. Mysql架构与内部模块-第三章

    前言 接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分. 正文: Mysql存储引擎作为本系列文章中相对重要的一环,也 ...

  3. .net架构设计读书笔记--第一章 基础

    第一章 基础 第一节 软件架构与软件架构师  简单的说软件架构即是为客户构建一个软件系统.架构师随便软件架构应运而生,架构师是一个角色. 2000年9月ANSI和IEEE发布了<密集性软件架构建 ...

  4. 大型分布式架构设计与实现-第一章SOA(面向服务的体系架构)

    拜读了大型分布式架构设计与实现,觉得该书作为入门不错,但内容过于简单,描述过于琐碎,小节之间连续性不强,不适合深入钻研学习.但为了更多的希望向架构师行业靠拢的工程师学习需要,本博客将对上书进行简化讲解 ...

  5. Mysql必知必会 第一章 了解SQL

    第一章 了解SQL 1.1 数据库基础 1.1.1 什么是数据库 数据库的定义:保存有组织的数据的容器 数据库软件不是数据库,而是DBMS 1.1.2 表 表(Table)的定义:某种特定类型数据的结 ...

  6. 第一模块第一章 review

    ---恢复内容开始--- 练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道的那些属于编译型,哪些属于解释型 机器语言:由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称 ...

  7. 高性能MySQL(第4版) 第一章 MySQL架构 读书笔记

    这本书去年11月出的,今年中文版也出了,并且直接上了微信读书,之后有空就读一读,分享下读书笔记~ 原文内容比较充实,建议有时间可以读一下原文. 第一章主要是个概览. MySQL的逻辑架构 默认情况下, ...

  8. 第一章 MYSQL的架构和历史

    在读第一章的过程中,整理出来了一些重要的概念. 锁粒度  表锁(服务器实现,忽略存储引擎). 行锁(存储引擎实现,服务器没有实现). 事务的ACID概念 原子性(要么全部成功,要么全部回滚). 一致性 ...

  9. 第 2 章 MySQL 架构组成

    麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...

随机推荐

  1. Fabric1.4 架构和原理

    #1.Fabric总体架构Fabric架构主要包括三个模块:会员(Membership),区块链(Blockchan)和链码(chaincode). 1.1成员服务 包含下列组件:注册.身份认证管理及 ...

  2. jmeter连接redis取数据

    1.导入fastjson-1.2.2.jar.jedis-2.2.1.jar到 jmeter\lib\ext\ 下 2.新建BeanShell Sampler import com.alibaba.f ...

  3. SpringBoot+Shiro+JPA+LayUI的后台管理系统

    一.系统说明 资源下载路径:https://download.csdn.net/download/qq_37171817/12056804 本系统是一个用SpringBoot做后台开发框架,Shiro ...

  4. oracle之二表和表空间的关系

    表和表空间的关系 建一个使用缺省值的表空间SQL> create tablespace a datafile '/u01/data/urpdb/a01.dbf' size 10m; 利用orac ...

  5. [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

    题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...

  6. Badboy脚本录制工具

    Badboy 目录 Badboy 1.Badboy安装 2.脚本的录制 1.Badboy安装 下载地址: http://www.badboy.com.au/download/index 安装其实傻瓜式 ...

  7. 原来写插件还可以选MEF

    MEF是微软提供的一个轻量级的ICO容器,可以轻易的解除程序集的依赖关系,最近想写个类似插件试的软件所以搜索了一下,终于淘到宝了. 下面我们看看MEF是如何解耦的 新建一个控制台项目两个类库 Ites ...

  8. VirtualBox中安装的CentOS开启SSH并设置访问外网

    1.全局设置NAT网络 打开VirtualBox->管理->全局设定 网络->添加按钮->添加一个NAT网络(使用默认的就行,不用改动) 2.设置用来本机于VirtualBox ...

  9. Module build failed: TypeError: this.getResolve is not a function at Object.loader 使用vue-cli 创建项目 使用sass时报错 -- 等其他sass 报错 ./node_modules/css-loader?{"sourceMap":true}!./node_modules/vue-loader/lib

    已经安装了 sass相关依赖包 npm  install sass-loader --save-devnpm install node-sass --sava-dev 并且在build文件下webpa ...

  10. Docker:三、深入Docker容器&Asp.net发版

    各位看官,我们前面已经有过两篇文章的研究了,哈哈,都是皮毛... 今天我们来看看docker容器内部,一探究竟... 一.进入docker容器 进入Linux容器非常简单,直接使用如下命令即可: do ...