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. 原生JDK网络编程- NIO之Reactor模式

    “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件处理器对某 ...

  2. Java Web制作登录 验证码

    具体操作如下: 新建一个servlet,代码如下:标记一个WebServlet, @WebServlet(urlPatterns = {"/checkCode"}) //验证码Se ...

  3. hacker101 CTF 学习记录(二)

    前言 无 Easy-Postbook 拿到功能有点多,先扫一遍目录 .Ds_Store没有啥东西,page是个静态页面 随便注册个账号,登录后已经有2篇文章,第一篇文章的id是1 自己创建文章,将ur ...

  4. 学习 | 基于require.js的三级联动菜单【入门】

    主要目的是学习如何使用require.js AMD就是通过延迟和按需加载来解决各个模块的依赖关系,其中require就是AMD的框架之一 它的优点是可以解决以下问题: JS文件的依赖关系. 通过异步加 ...

  5. JUC使用

    1.什么是JUC 源码 + 官方文档 面试高频问! java.util 工具包.包.分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比入 Callable 相对较低! 2 ...

  6. 使用Mysql分区表对数据库进行优化

    早期工作中没有做好足够的设计,目前记录表单表数据2000w且无有效索引,表现是分页缓慢,模糊查询拉闸. 当前业务中,写操作会多于读操作,时不时会遇到慢SQL占用过多的数据连接,导致写操作无法正常进行. ...

  7. django中url和reverse使用

    使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响, 其实在模板, view中,如果想获取当前访问的url,那用re ...

  8. Codeforces Round #673 (Div. 2)

    [Codeforces Round #673 (Div. 2) ] 题目链接# A. Copy-paste 思路: 贪心的策略.每次只加上最小的就可以了 #include<bits/stdc++ ...

  9. 使用redis来调用iptables,封禁恶意IP

    话不多说,通常大多数站点都会有被薅羊毛的情况,防护无非也就是业务层做处理,短时内不再响应恶意请求啦.虽然不响应了,可还是会消耗资源的,比如我要从数据库(当然也可能是内存数据库)去查询下,你是不是恶意的 ...

  10. Kafka处理请求的全流程分析

    大家好,我是 yes. 这是我的第三篇Kafka源码分析文章,前两篇讲了日志段的读写和二分算法在kafka索引上的应用 今天来讲讲 Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如 ...