MySQL逻辑架构图分析

2023-10-27

在这里插入图片描述

MySQL逻辑架构图

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

Server层:

大多数MySQL的核心服务功能都在这一层,包括连接器查询缓存分析器优化器执行器,以及所有内置函数(日期、时间、数学、加密函数等)和所有跨存储引擎的功能(存储过程、视图、触发器等),不同存储引擎共用同一个Server层。

存储引擎层:

存储引擎是MySQL数据库的核心,是底层物理结构的实现,负责MySQL中数据的存储和提取。

MySQL数据库区别于其它数据库的一个最主要的特点是其基于表的插件式存储引擎(InnoDB、MyISAM、Memory、Archive、NDB等),目前最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

每个存储引擎都有它的优势和劣势,Server层通过API与存储引擎层进行通信。

连接器

负责客户端跟服务器建立连接、身份认证(用户名、客户端IP、密码是否正确 / 证书是否正确等)、权限验证、维持和管理连接等操作。

查询缓存

在MySQL查询缓存开关开启的前提下,MySQL会将执行过的查询语句和结果,以key-value的形式,缓存在内存中的一个引用表中。

key为包含查询语句、数据库信息、客户端协议版本等影响查询结果的信息的哈希值,value为查询结果。

当MySQL服务端接收到一条SQL语句时,先通过一个大小写不敏感的检查判断SQL语句是否以 SEL 开头,如果是,则检查查询缓存,如果命中缓存,再检测一下用户权限,如果权限满足,MySQL会直接将这个value当作查询结果返回给客户端,而跳过后续的分析、优化、执行等过程。

并不是所有的查询语句和结果都会被缓存,当查询语句中有一些不确定的数据时,则不会被缓存。例如查询语句中包含NOW()、CURRENT_DATE、CURRENT_USER()等函数,因为每次查询返回的结果可能不同,所以不会被缓存。事实上,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL中的系统表或者任何包含列级别权限的表,则都不会被缓存。

SELECT语句没有从查询缓存中返回数据的情况称为 “缓存未命中” ,缓存未命中可能有如下几种情况:

  • 查询语句之前没有被执行过,所以也未曾被缓存过;
  • 查询语句中包含不确定的函数等,导致无法被缓存;
  • 查询语句对应的查询结果太大,导致无法被缓存;
  • 虽然之前被缓存过,但因为查询缓存的内存空间耗尽,导致某些缓存被“逐出”;
  • 数据表被修改(如执行过update语句),则导致此表对应的所有缓存被清空;
  • 此次查询语句跟之前执行的查询语句有任何的字符上的不同,例如空格、注释等不同,也会导致缓存不命中。

查询缓存带来的并不都是系统性能的提升,同时也会带来额外的消耗:

  • 每次查询执行时,都会先检查是否命中查询缓存;
  • 如果一个查询可以被缓存,并且之前还未被缓存过,则在执行完成后,会将本次查询及结果存入查询缓存中,这会带来额外的系统消耗;
  • 当某个表被更新时,MySQL会将对应表的所有缓存都设置失效。如果表数据更新频繁或者查询缓存特别大,这个操作可能会带来很大的系统消耗。

当查询缓存带来的资源节约大于其本身造成的资源消耗时才会给系统带来性能提升。对于不经常更新的数据来说,使用缓存还是可以的。

需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

分析器

分析器负责SQL语句解析和语法规则校验等。

分析器会先做 “词法分析” 。输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么,如关键字、表名、列明等。

做完 “词法分析” ,分析器就要做 “语法分析” 。根据词法分析的结果,语法分析器会根据语法规则,判断输入的这个 SQL 语句是否满足 MySQL 语法:

  • 是否使用了错误的关键字,如SELCT;
  • 关键字顺序是否正确,如 FROM 在 WHERE 前边;
  • 引号是否前后匹配;
  • 数据表以及数据列是否存在;
  • 名字和别名是否有歧义;
  • 对某字段的运算是否允许,例如不能对一个整数使用 SUBSTRING() 函数。

最后还会进行权限校验。

优化器

优化器负责将分析器生成的 “语法树” 转化成执行计划。一条查询可以有很多种执行方式,最后都会返回相同的结果,优化器的作用就是找到其中最好的执行计划。

MySQL的查询优化器是一个非常复杂的部件,它使用了很多优化策略来生成一个最优的执行计划:

  • 重新定义关联表的顺序
  • 将外连接转化为内连接
  • 使用等价变换规则(如,where a > 100 and a > 200 会转化为 where a > 200;where a < b and a = 5 会转化为 where b > 5 and a = 5等)
  • 优化 COUNT()、MIN()、MAX()
  • 覆盖索引扫描(当索引中的列包含所有查询需要使用的列的时候,MySQL就可以使用索引返回需要的数据,而无需再查询对应的数据行)
  • 子查询优化
  • 提前终止查询
  • 查询条件中有多个索引的时候,决定使用哪个索引

执行器

执行器负责根据优化器生成的执行计划来完成整个查询。MySQL执行器根据执行计划给出的指令逐步执行,其中大量的操作需要通过调用存储引擎实现的接口来完成。如,查询某个索引第一行的接口、查询某个索引条目下一条目的接口等。

小结

以上就是MySQL逻辑架构的大体介绍。掌握MySQL的逻辑架构,对于以后深入了解MySQL数据库会有极大的帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL逻辑架构图分析 的相关文章

  • MySQL 导入 125000 行 CSV 的最快方法?

    这是我第一次使用 MySQL 除了对现有数据库进行一些基本查询之外 所以我不擅长解决这个问题 我有一个包含 125 000 条记录的 CSV 我想将其加载到 MySQL 中 我安装了版本 8 和工作台 我使用导入向导加载 CSV 它开始导入
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • MYSQL 查询返回“资源 id#12”而不是它应返回的数值

    不知道为什么 但这返回了错误的值 我正在取回此资源 ID 12 而不是我正在寻找的数值 1 执行此操作的代码是 type SELECT account type from user attribs WHERE username userna
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c

随机推荐

  • 游戏设计之路——游戏设计文档详解(GDD)

    本文是我的 通关 游戏设计之道 的读书笔记 根据自己的理解对原文进行了归纳总结与改动 非常推荐大家去购买这本书 1 简介 1 1 什么是游戏设计文档 GDD 游戏设计文档 game design document GDD 是在游戏开发的筹备
  • vue3表格导出Excel(全网最细)​

    1 安装插件 npm install save xlsx 0 17 3 npm install save file saver 2 0 5 2 新建一个js文件夹放编写的js 在src下新建htmlToExcel js文件 然后再htmlT
  • CentOS 安装 opencv, 解决 Python cv2 module 问题(终极解决方法)

    下载安装包 wget https github com opencv opencv archive 2 4 13 zip 1 从官网下载 opencv 2 4 13 zip 2 执行安装 如果提示文件opencv 2 4 13 zip太大可
  • Java 随机读写流 复习题

    题目 在记事本中输入若干同学的姓名和成绩等信息作为原文件 编写一个Java源程序 其中的文件读写部分使用RandomAccessFile类来完成 程序实现的功能如下 编写一个包含主方法main的公共类 访问权限为public的类 主方法ma
  • Git从下载到配置到链接远程仓库全套教程

    目录 前言 一 Git的下载与安装 1 下载 2 安装 二 生成及配置SSH密钥 1 生成SSH密钥 2 配置SSH密钥 三 本地仓库与远程仓库连接并推送到远程仓库 总结 前言 每次进一个新公司都要下载配置git 这些东西也就配置那一次 所
  • pyqt 自定义信号,对默认信号触发的槽函数添加参数

    from PyQt5 QtCore import QObject pyqtSignal class QTypeSignal QObject sendmsg pyqtSignal object 使用pyqtSignal类实列发射信号 obje
  • Cuda

    文章目录 引言 一 Cuda安装 1 选择Cuda版本 2下载及运行安装程序 3 测试 二 Cudnn安装 1 进入官网下载对应cuda版本的cudnn 2 下载好相应版本并进行解压安装 3 解压完成后 4 测试 引言 学习的最大理由是想摆
  • Java知识点之Map(一)

    Map Map相关的内容在面试过程中都是一个重要的点 问深了会涉及到很多数据结构和线程相关的问题 你了解Map吗 常用的Map有哪些 Map是定义了适合存储 键值对 元素的接口 常见的Map实现类有HashMap Hashtable Lin
  • @RunWith注解的作用

    RunWith注解的作用 RunWith就是一个运行器 RunWith JUnit4 class 就是指用JUnit4来运行 RunWith SpringJUnit4ClassRunner class 让测试运行于Spring测试环境 Ru
  • 不容错过的Vue2.0组件开发

    简述 http www jianshu com p 313f11bccb33 utm source tuicool utm medium referral 本文针对于有Vue有一定基础的人学习了解 环境搭建等入门教程网上很多 大家自行学习
  • [ 注意力机制 ] 经典网络模型1——SENet 详解与复现

    Author Horizon Max 编程技巧篇 各种操作小结 机器视觉篇 会变魔术 OpenCV 深度学习篇 简单入门 PyTorch 神经网络篇 经典网络模型 算法篇 再忙也别忘了 LeetCode 注意力机制 经典网络模型1 SENe
  • 增程式电动汽车电控系统优化方法【matlab】

    一 主要内容 针对增程式电动汽车的传动系统架构 结合增程式乘用车和增程式电动公交的设计 对传动系统关键部件选型匹配以及电控系统工作模式进行论述 并论述了工况对行驶里程 以及电池充放电的影响因素 对通用汽车的Volt增程式电动汽车进行分析研究
  • B站价值60亿跨年晚会背后的微服务治理

    B站价值60亿跨年晚会背后的微服务治理 大家都知道微服务有两个痛点 一个是如何拆分微服务 微服务的边界怎么划分制定 二是微服务上了规模之后如何管理 因为只要上了规模 任何小小的问题都可能会被放大 最后导致雪崩效应 一 微服务化带来的挑战 上
  • 《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》

    Spring 5 x源码解析之Spring AOP 注解驱动使用及其实现原理 学好路更宽 钱多少加班 mercyblitz 一 前言 大家好 欢迎阅读 Spring 5 x源码解析 系列 本篇作为该系列的第二篇 重点介绍Spring AOP
  • 离线搭建深度学习环境

    离线搭建深度学习环境 文章目录 离线搭建深度学习环境 Anaconda3离线安装 借助可联网PC下载安装包 安装Anaconda3 配置深度学习环境 获取深度学习环境 打包深度学习环境 拷贝深度学习环境 添加深度学习环境到环境列表 有时出于
  • Linux使用套接字 udp协议传输

    第一步是来认识库 需要哪些库 需要哪些库中的函数 哥们也只是 初学者 仅仅只是会调用的地步 后面有机会再加深 首先咱们需要清除的知道工作流程 第二步是直接写代码 开发工具 qtcreator6 环境 win10 虚拟机 ubuntu20 0
  • Vue学习杂记(五)——loader的使用

    Vue学习杂记 五 loader的使用 一 什么是loader 二 loader处理css 三 loader处理图片 四 loader处理高级的js语法 参考文献 引言 loader其实也是webpack系列的内容 考虑到webpack涉及
  • gradle使用教程,小白一篇就够

    概述 Gradle是新一代构建工具 从0 x版本一路走来虽然国内可寻的资料多了一些 但都是比较碎片化的知识 官方的Userguide虽然是业内良心之作 但无奈太长 且版本变化较快 又鉴于很多同学一看到英文内心便已认定无法读懂 遂打算利用业余
  • E tensorflow/stream_executor/cuda/cuda_dnn.cc:352] Loaded runtime CuDNN library: 5005 (compatibility

    WARNING tensorflow From usr local lib python2 7 dist packages tensorflow python util tf should use py 170 initialize all
  • MySQL逻辑架构图分析

    MySQL逻辑架构图 大体来说 MySQL 可以分为 Server 层和存储引擎层两部分 Server层 大多数MySQL的核心服务功能都在这一层 包括连接器 查询缓存 分析器 优化器 执行器 以及所有内置函数 日期 时间 数学 加密函数等