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. 如何让Web程序在点击按钮后出现如执行批处理程序般的效果

    在cli程序中,输入命令得到连续的输出已经是一种进度而美观的页面交互形式,好比下图: 而web程序里也有类似的场景,比如执行一个耗时任务,除了显示出等待图标外,用户还希望把执行的状态及时显示出来.如下 ...

  2. [oracle/sql]写SQL从学生考试成绩三表中选出五门分综合超过720的尖子

    任务:有学生,科目,考分三张表,需要从中筛选出五门考分总和超过720的学生. 科目表最简单只有五条记录: CREATE TABLE tb_course ( id NUMBER not null pri ...

  3. [Java数据结构]LinkedHashMap,TreeMap

    HashMap不能记住插入时的顺序,但LinkedHashMap可以做到这一点. 例程: Map<Integer,String> empMap=new LinkedHashMap<I ...

  4. Oracle数据库之表与表数据操作

    一.SQL语言 SQL语言分为四种,分别是:数据定义语言(DDL).数据操纵语言(DCL).事务控制语言(TCL).数据控制语言(DML). 1.1 数据定义语言(DDL) 建立.修改.删除数据库对象 ...

  5. 大神Java8写了一段逻辑,我直呼看不懂

    业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...

  6. golang开发:CSP-WaitGroup Mutex

    CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,最初于Tony Hoare的1977年的论文中被描述,影响了许多编程 ...

  7. [Java核心技术]五-继承(枚举类)

    ####Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等.编译再反编译可以看到枚举类型对应的类的内容. 每个枚举常量都对应一个 ...

  8. Vue+SpringBoot项目实战(一) 搭建环境

    GitHub 地址: https://github.com/dongfanger/sprint-backend https://github.com/dongfanger/sprint-fronten ...

  9. SSM框架中,事务无法回滚的原因和解决

    原因: 由ServletContextListener加载spring配置文件产生的是父容器,springMVC产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实 ...

  10. java 多线程-3

    十.同步机制解决Thread继承安全问题 创建三个窗口买票,共100张票.用继承来实现 方式一:同步代码块 public class RunMainExtends { public static vo ...