首页 > 数据库 >mysql的内部组件结构

mysql的内部组件结构

时间:2024-12-19 16:08:42浏览次数:4  
标签:语句 内部 mysql 连接器 MySQL 组件 权限 连接

https://note.youdao.com/yws/public/resource/f030268c54f18d2116837f8f3ef045bf/xmlnote/72259A43874840CCA1A278251A4003E2/127990

大体来分,MySQL分为引擎层和server层

server层

连接器、查询缓存、分析器(解释器)、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

连接器

Navicat建立和MySQL的连接,就是连接器建立的。

连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的:

mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306

连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

1、如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

2、如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。连接器那一次查询到的权限,将伴随这整次连接

一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置

理解一下就是连接器做权限校验,连接器确定的权限,将伴随这整次连接

查询缓存

基本不用,MySQL8已经移除

分析器

如果没有命中缓存,就要开始sql的执行了,首先MySQL需要知道你要干什么,

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

MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。

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

如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比如下面这个语句 from 写成了 "rom"。

词法分析和语法分析

mysql> select * fro test where id=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'fro test where id=1' at line 1

https://note.youdao.com/yws/public/resource/f030268c54f18d2116837f8f3ef045bf/xmlnote/3A889AD62FDB42FF8D5E8EFA9A9F4970/127941

SQL语句经过分析器分析之后,会生成一个这样的语法树

https://note.youdao.com/yws/public/resource/f030268c54f18d2116837f8f3ef045bf/xmlnote/C136B98C13FF4FA690B445BC6C078D3E/127943

优化器

过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序;以及一些mysql自己内部的优化机制。

用什么索引,以及内部的一些优化机制

执行器

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证)。

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

标签:语句,内部,mysql,连接器,MySQL,组件,权限,连接
From: https://www.cnblogs.com/wbstudy/p/18617448

相关文章

  • 在Android Studio中,通过设置腾讯镜像和代理解决无法下载gradle和gradle.plugin等组件
    诸神缄默不语-个人CSDN博文目录这个出现在刚打开项目的时候,下载一堆必要的组件……无法下载gradle的报错信息是:CouldnotinstallGradledistributionfrom'https://services.gradle.org/distributions/gradle-8.9-bin.zip'.Reason:java.net.SocketTimeoutException:......
  • 探索华为鸿蒙系统的多行文本输入框组件(Textarea)
    探索华为鸿蒙系统的多行文本输入框组件(Textarea)在华为鸿蒙系统的应用开发中,用户交互组件是构建出色用户体验的关键要素之一。其中,多行文本输入框组件(Textarea)为用户提供了方便的多行文本输入功能,适用于各种场景,如评论框、消息输入框等。今天,我们将深入了解Textarea组件的使用方......
  • MySQL中EXPLAIN的Extra字段值Using index 或 Using index,Using where 或 Using where
    MySQL的架构分成了server层和存储引擎层(storageengine),server层通过调用存储引擎层来返回数据。1.Usingindex表示查询的列被索引覆盖,因而无需回表查询,因而效率更高。2.Usingindex,Usingwhere表示查询的列被索引覆盖,且where筛选条件是索引列前导列的一个范围,或者是索引列的......
  • BY组态-低代码web可视化组件
      简介BY组态是集实时数据展示、动态交互等一体的全功能可视化平台。帮助物联网、工业互联网、电力能源、水利工程、智慧农业、智慧医疗、智慧城市等场景快速实现数字孪生、大屏可视化、Web组态、SCADA等解决方案。具有实时监控、多样、变化、动态交互、高效、可扩展、支持......
  • Java笔记(抽象类、接口、内部类、final关键字)
    Java笔记(抽象类、接口、内部类、final关键字)(一).抽象类抽象方法所在的类就是抽象类,抽象方法是在public和void中间加一个abstract,表示子类继承父类(父类是抽象类)的方法时必须重写,否则直接报错1.抽象方法和抽象类2.抽象类和抽象方法的定义格式3.抽象类和抽象方法的注意......
  • MacOS+vscode调试mysql8.0源码
    环境:MacOsM1vscode前置:安装brew##安装brew/usr/bin/ruby-e"$(curl-fsSLhttps://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"##环境变量eval"$(/opt/homebrew/bin/brewshellenv)"下载源码带boost版本下载之后解压vscode插件安装##直接搜索,然后安......
  • win10下安装配置mysql5.7Windows下使用解压版配置安装MySQL
    1.下载MySQL访问MySQL官方网站下载页面:https://dev.mysql.com/downloads/mysql/选择MySQLCommunityServer(免费版),选择适合Windows的版本(例如,Windows(x86,32-bit),MSIInstaller)。下载安装程序并运行。2.使用msi直接安装MySQL运行下载的安装程序。接受许可协议。在安装类型选......
  • 【MySQL】InnoDB存储引擎中的页
    目录1、背景2、页的组成3、各部分讲解【1】文件头部【2】页头部【3】最小记录和最大记录【4】行记录【5】空闲空间【6】页目录【7】文件尾部4、总结1、背景mysql中存储数据是存储引擎干的事,存储引擎存储数据的基本单位是页,我们往数据库插入表中的一条条记录就是存储......
  • 微信小程序--图片预览组件(可缩放拖动)
    一.自定义图片预览组件,展示图片处理previewImg.wxml<viewclass="preview_box"wx:if="{{previewHideStatus}}"style="top:{{preview_box_top}}"catchtouchmove='stopPageScroll'><details><summary>点击查看代码</summary>......
  • 微信小程序自定义组件boundingClientRect获取到的rect值为null
      解决办法: 在自定义组件内获取必须用SelectorQuery.in()Component({lifetimes:{ready(){constquery=wx.createSelectorQuery().in(this)constnum=Math.ceil(this.data.picList.length/LINE_LENGTH)query.select('.tab-content-i......