1.MySQL基础架构
好久没发博客了,终于又学完了一点知识并且进行了整理。就从这个MySQL系列开始继续坚持每个月产出几篇。
声明一下,这次的MySQL系列是针对已有一定基础的小伙伴的,关于SQL的使用,一些概念的介绍就不再这里写了。
首先我们来看一个简易的图片,学习MySQL的基础架构:

MySQL的架构主体可分为: Server层和存储引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器。所有跨存储引擎的功能都在这一层实现。
我们先介绍一下一个查询的语句,MySQL的执行流程:
- 应用服务器与数据库服务器建立一个连接
- 数据库进程拿到请求sql
- 解析并生成执行计划,执行
- 读取数据到内存并进行逻辑处理
- 通过步骤一的连接,发送结果到客户端
- 关掉连接,释放资源
根据这个流程,我们来详细介绍每个组成的概念及意义。
连接器:
负责跟客户端建立连接,获取权限,维持和管理连接。通过TCP握手建立连接后,连接器开始认证用户身份。
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。在MySQL5.5之后,支持线程池插件,可以使用池中少量的线程来服务大量的连接,不需要再为每个新连接创建或销毁线程。
连接器验证方式:
用户名+密码+原始主机信息
使用SSL方式连接,还可以使用X.509证书认证
验证结果及处理方式:
验证失败,返回Access denied for user的错误,客户端程序结束执行。
验证成功,连接器会在权限表中查出用户拥有的权限。之后,在这个连接里的权限判断都将依赖于此刻读到的权限。一次成功的连接中,即使管理员修改了用户权限,也不影响已经存在的连接的权限。
补充:连接建立的过程比较复杂,应尽量减少连接的动作,使用长连接。注意:MySQL在执行过程中临时使用的内存是管理在连接对象里的,这些资源在连接断开时才释放,长连接累积下来可能导致内存占用过大,被系统强行杀掉。
解决此种问题有两种常用方案:
定期断开长连接,或程序里判断一个占用内存过大的查询后,断开连接再重连。
MySQL5.7后,可以在每次执行一个较大的操作后,执行mysql_reset_connection来重新初始化连接资源。这个过程无需重连和权限校验,但是会将连接状态恢复到刚创建完的状态。
查询缓存:
MySQL拿到一个查询请求后,如果查询缓存打开,MySQL会优先检查这个查询是否命中缓存中的数据。
该检查是通过一个大小写敏感的哈希查找实现。查询和缓存中的查询即使只有一个字节不同,也不会匹配缓存结果。如果命中了缓存,在返回结果前MySQL会检查一次用户权限,没问题则跳过其他阶段,直接从缓存中拿到结果并返回给客户端。没有则进行后续的逻辑,并从DB中拿到结果存入查询缓存后返回客户端。
查询缓存的使用情况:
对表的更新会导致该表上所有的查询缓存被清空,对于频繁更新的库,查询缓存的命中率很低
对于静态表,很长时间更新一次的表,可以适当采用查询缓存。
MySQL8之后,查询缓存功能被删掉了,之前的版本可以通过:query_cache_type=DEMAND,来设置是否使用查询缓存,或显示的在查询上使用SQL_CACHE
SELECT SQL_CACHE * FROM dual
查询优化处理:
当没有命中查询缓存时就开始真正的执行语句了。在该阶段SQL语句会被转换为一个执行计划,MySQL依照这个执行计划和存储引擎进行交互。该过程包含了多个子阶段:解析SQL、预处理、优化SQL执行计划。我们分部来介绍:
分析器:
MySQL首先要知道语句要做什么,因此会对SQL进行解析,先词法分析然后语法分析。MySQL在这个阶段通过关键字将SQL语句进行解析,并生成一颗对应的解析树。在该阶段MySQL将会使用语法规则和解析查询。
它要做的包含以下内容:
- 验证是否使用错误的关键字
- 使用关键字的顺序是否正确
- 验证引号是否能前后正确匹配
- 判断解析树是否合法:将检查数据表和数据列是否存在,还会解析名字和别名是否有歧义
优化器:
当分析器执行完后,现在语法树被认为是合法的了,优化器就会将其转换为一个执行计划。一条查询可以有很多执行方式,最后都返回相同结果。优化器的最主要作用就是找到其中最好的执行计划。
关于查询优化阶段其他的详细内容,后序会有专门的文章进行介绍。
执行器:
MySQL通过分析器知道了语句要做什么,通过优化器知道了怎么做,之后进入执行器开始执行语句。
开始执行时会判断用户对该表是否有相应操作的权限,如果没有,则返回没有权限。反之,打开表继续执行。此时执行器会根据表的引擎定义,去使用这个引擎提供的接口,然后获取结果返回客户端。
参考文献:
高性能MySQL第三版
MySQL实战45讲
1.MySQL基础架构的更多相关文章
- MySql基础架构以及SQL语句执行流程
01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...
- MySQL基础架构分析
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! MySQL基础架构 一.引言 我们在学习MySQL的时候,迈 ...
- MySQL基础架构之查询语句执行流程
这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的. 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条 ...
- MySQL基础架构
前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询, ...
- MySQL运行原理与基础架构
1.MySQL基础 MySQL是一个开放源代码的关系数据库管理系统.原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用. 2008年My ...
- MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行
最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...
- MySQL:基础架构和工作流程
[参考文章]:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分. Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服 ...
- MySQL 基础知识(基本架构、存储引擎差异)
前言: // MySQL 并发.异步IO.进程劫持 最近在看高性能 MySQL,记录写学习笔记: 高性能 MySQL 学习笔记(一) 架构与历史 笔记核心内容:MySQL 服务器基础架构.各种存储引擎 ...
- 高性能MySQL之基础架构
一.背景 为什么我们需要先学习MYSQL的基础架构先呢? 原因很简单,当我们需要了解一件事物的时候,我们只有站在宏观的层面,才能层层剥丝抽茧的去理解问题.举个例子,我们要看一个框架的源码,一开始就想进 ...
随机推荐
- 关于KiCAD的一些插件
关于KiCAD的一些插件 https://gitee.com/KiCAD-CN/KiCad-CN-Forum/blob/master/KiCad_help_zh_CN.md#swapit-%E5%B7 ...
- docker 部署 mysql8 的 docker-compose 文件编写
version: '3.4' services: mysql: container_name: platform.mysql. deploy: resources: limits: memory: 3 ...
- codeforces 724G - Xor-matic Number of the Graph 线性基+图
题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- 【LeetCode】拓扑排序
[207] Course Schedule 排课问题,n门课排课,有的课程必须在另外一些课程之前上,问能不能排出来顺序. 题解:裸的拓扑排序.参考代码见算法竞赛入门指南这本书. class Solut ...
- Linux 操作系统介绍
应用软件——操作系统——硬件 操作系统的作用 是现代计算机系统中最基本和最重要的系统软件 是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展 主要作用是管理好硬件设备,并为用户和应用程序提供一个 ...
- FTP的PORT和PASV的连接方式以及数据连接端口号计算
FTP的PORT和PASV的连接方式以及数据连接端口号计算 PORT(自动)方法的连接途中是: 客户端向服务器的FTP端口(原始是21)发送连接请求,服务器领受连接,建立一条command链路. ...
- SQL 空值
SQL NULL Values(空值) 什么是SQL NULL值? SQL 中, NULL 用于表示缺失的值.数据表中的 NULL 值表示该值所处的字段为空. 具有NULL值的字段是没有值的字段. 如 ...
- 8、iota枚举
1.iota常量自动生成器,每一行,自动累加1 2.iota给常量赋值使用 3.如果iota遇到const,就会重置为0 4.可以可以只写一个iota 5.如果是同一行,值是一样的 // 09_iot ...
- linux IPC的PIPE
一.PIPE(无名管道) 函数原型: #include <unistd.h> ]); 通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道. 父进程和子进程之 ...