首页 > 数据库 >数据库的底层逻辑

数据库的底层逻辑

时间:2023-10-12 17:57:45浏览次数:35  
标签:语句 逻辑 缓存 数据库 存储 查询 SQL 客户端 底层

服务器向客户端请求一共分别三层

第一层:连接层

第二层:服务层

第三层:引擎层

存储层

(1)服务器处理客户端请求

服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?

这里以请求为例展示:

下面具体看一下

第一层:连接层

系统(客户端)访问MySQL数据库之前,做的第一件事就是TCP连接。

经过三次握手成功后,MySQL服务器对TCP传输过来的账号密码做身份认证,权限获取。

                1.用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行。

                2.用户密码认证通过,会从权限表查出账号拥有权限和连接关联,之后权限判断逻辑。都将依赖于此时读到的权限

       TCP收到请求后,必须要分配给一个线程专门与这个客户段的交互。还会有个线程池。去走后面的流程。每个连接从线程池中获取

线程,省去了扩建和销毁线程的开销。

第二层:服务层

       SQL Interface: SQL接口

               1.接收客户sql命令,并返回用户需要查询的结果。比如:SELECT...FROM就是调用SQL interface

               2.MySQL支持DML(数据操作语言),DDL(数据定义语言),存储过程,视图,触发器,自定义函数等多种SQL语言接口。

       Parser: 解析器

               1.在解析器中对SQL语句进行语法分析,语义分析。将SQL语句分析成数据结构,并将这个数据结构传递到后续步骤,以后的

          SQL语句的传递和处理都是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。

               2.在SQL命令传递到解说器的时候会被解说器验证和解析,并为其创建语法数,并根据数据字典丰富查询语法树,并根据数据

          字典丰富查询语法树,会验证客户端是否具有执行该查询的权限。创建好语法树后。MySQL还要对SQL查询进行语法上的优化,

          进行查询重写。

    Optimizer: 查询优化器

              1.SQL语句在语法解析之后,查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划

              2.这个执行计划表明应该使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行

         计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果反馈给用户。

              3.它使用“选取-投影-连接”策略进行查询。

              例如:SELECT id,name FROM student WHERE gender = '女';

              这个SELECT查询先根据WHERE语句进行 选取,而不是将表全部查询出来以后再进行gender过滤。这个SELECT查询先根

         据id和name进行属性 投影,而不是讲述想全部取出以后再进行过滤,将这两个查询 连接 起来生成最终查询结果。

             Caches & Buffers: 查询缓存组件

             1.MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对

         应的查询结果,那么就不必再进行查询解析,优化和执行的整个过程了,直接将结果反馈给客户端。

            2.这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。

            3.这个查询缓存可以在不同客户端之间共享

            4.从MySQL5.7.20开始,不推荐使用查询缓存,并在MySQL8.0中删除,因为这个比较鸡肋

第三层:引擎层

         插件式存储引擎层,真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

 

MySQL 8。0.25默认支持的存储引擎如下:

 

存储层

     所有数据,数据库,表定义,表的每一行的内容,索引,都是存在文件系统上,以文件在的,并完成与存储引擎的交互。当然有些存

储引擎比如innoDB,也支持不使用文件系统直接管理裸设备,的那现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以

使用本地磁盘,可以使用DAS,NAS,SAN等各种存储系统。

总结

下面为了熟悉SQL执行流程方便,我们可以简化如下:

 

简化为三层结构:

1.连接层:客户端和服务器端建立连接,客户端发送SQL至服务器端;

2.SQL层(服务层):对SQL语句进行查询处理;与数据库文件的存储方式无关;

3.存储引擎层;与数据库打交道,负责数据的存储和读取。

 

标签:语句,逻辑,缓存,数据库,存储,查询,SQL,客户端,底层
From: https://www.cnblogs.com/gao-yf/p/17760149.html

相关文章

  • 数据库解决获取一个字段parent中某个字符串child第一次和第二次出现的位置之间的内容c
    下面就postgresql数据和oracle数据库分别提供两种解决方法--postgresql数据库解决获取一个字段parent中某个字符串child第一次和第二次出现的位置之间的内容cut--方法一selectcasewhenposition(childinparent)>0thensubstring(parent,position(childinparent)+l......
  • Oracle数据库导入、导出详解
    Oracle11g数据库导入导出方式传统方式【exp(导出)和(imp)导入】数据泵方式【expdp导出和(impdp)导入】第三方工具【PL/sqlDevelpoer】一、什么是数据库导入导出?Oracle11g数据库的导入/导出,就是我们通常所说的Oracle数据的还原/备份。 数据库导入:把.dmp格式文件从本地导入到......
  • 【2023年10月12日】stf61-MySQL数据库
     stf61-MySQL数据库前言1)为什么学?● 常见的笔试题● 有利于更好的开展测试工作2)学什么?理论:基本的术语和概念实操:数据库操作、表操作、数据操作、其他常见数据库功能3)怎么学?多在实训环境里练习,在练习中掌握 理论 数据库系统: 表:8条记录/行,6个字段/列 ......
  • 推荐 四种优秀的数据库设计工具
    众所周知,良好的数据库设计能够大幅减少后期的运维工作,同时也能最大程度地减少软件项目出错的可能。由于我们所面临的真实项目需求往往五花八门,因此需要找到合适的设计工具,来实现事半功倍的效果。本文将从如下四个方面和您一起比较四种优秀数据库设计工具的各自优缺点。用户界面可支......
  • 记一次MySQL数据库恢复
    1、恢复步骤概要备份frm、ibd文件如果mysql版本发生变化,安装回原本的mysql版本创建和原本库名一致新库,字符集都要保持一样通过frm获取到原先的表结构,通过的得到的表结构创建一个和原先结构一样的空表。使用“ALTERTABLEDISCARDTABLESPACE;”命令卸载掉表空间将原先的ibd拷贝到my......
  • MySQL 定时备份数据库
    在操作数据过程中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述了几种方法进行MySQL定时备份数据库。1、mysqldump命令备份数据在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据......
  • 如何保证缓存与数据库双写时的数据一致性
    1、背景在做系统优化时,想到了将数据进行分级存储的思路。因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高,比如订单和流水的数据。所以这里根据数据要求实时性不同将数据分为三级。第1级:订单数据和......
  • mysql复制数据库,数据库排序规则不一致问题
    mysql复制数据库步骤1.导出数据库sql文件mysqldump数据库名-h数据库地址-P数据库端口(3306可省略)-u账号-p密码--add-drop-table>/路径/sql文件名.sql 2.确认导出和导入数据库编码和排序规则是否一致showglobalvariableslike'%coll%'showglobalvariabl......
  • C# 跳过值班时间代码逻辑
    ///<summary>///当前时间是否是值班时间///</summary>privateboolIsDutyTime{get{vardutyTime="23:00-07:00";if(!string.IsNullOrEmpty(dutyTime)){varnow=DateTime.Now;varsp......
  • 如何解决逻辑删除is_del与数据库唯一约束冲突
    前言不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束A,当该业务进行逻辑删除后(设置标记为删除状态is_del=1),再往唯一约束列插入相同的值时,此时会报Duplicateentry,但在业务上,该值时必须要插入的。今天我们就来聊聊处理这种业务场景的几种思路解决思路方案一:不采用逻......