文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!
搜索关注微信公众号 码出Offer 领取各种学习资料!

MySQL基础架构


一、引言

我们在学习MySQL的时候,迈入MySQL大门的第一步就是了解并安装MySQL客户端,随后才是使用MySQL做一系列数据库操作。但是往往被我们忽略的却是真正了解MySQL基础架构,为什么要这么说呢?因为在对数据库数据CURD操作的时候,也会出现一些问题或异常情况,此时并不是要去盲目的解决问题,而是直戳本质,快速定位并解决问题。

二、MySQL基础架构图

MySQL基础架构可以分为两大类:Server层和存储引擎层

  • Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现
  • 存储引擎层: 存储引擎有很多,各自有着各自的特点,可以根据场景来选择不同的存储引擎来操作数据
Server层 存储引擎层

Server层

存储引擎层

三、MySQL基础架构零件分析

  • 连接器: 管理连接,权限验证
  • 分析器: 词法分析,语法分析
  • 查询缓存: 命中缓存,返回结果
  • 优化器: 执行计划生成,索引选择
  • 执行器: 操作引擎,返回结果
  • 存储引擎: 存储数据,提供读写接口

四、基础零件剖析

4.1 连接器

使用MySQL数据库,第一步是要连接MySQL数据库,这时候第一个迎接的你就是连接器。连接器负责跟客户端建立连接、获取权限、管理连接等工作。我们一般是使用命令mysql -uroot -p + Enter后输入密码并登录。当输入密码提交登录时,MySQL客户端会与服务器建立连接,在完成TCP握手后,连接器就开始确认你所输入的用户名和密码。如果用户名密码正确则成功登录,如果用户名密码错误,会受到如下错误信息!

登录失败错误信息

image-20200712114731957

登陆成功后,连接器会对你进行权限验证,此时权限验证都依赖于这时候读取到的权限,并根据你的权限而赋予对数据库的操作的权力。正是因为权限验证对验证时权限读取的依赖问题,也反映出了如下注意点!

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

4.2 查询缓存

连接建立完成后,假设你正在使用该SQL语句查询一条数据select * from tb_user where id = 1。接下来MySQL执行逻辑就回到了查询缓存中。此时MySQL拿到一个查询请求后,先到查询缓存里看看是否执行过一这条SQL语句,在之前如果执行过这条语句,其结果大概就是以Key-Value(键值对)的形式直接缓存在内存中。这里的Key代指的是查询语句,Value代指的是查询结果。如果你所查询的语句在查询缓存中就命中缓存,它就会把该SQL语句对应的value值结果集返回,这样就并不会执行其他MySQL零部件了,大大提高了查询效率。

但是往往利弊是同时存在的,查询缓存有着一个致命的缺点,那就是查询缓存失效十分频繁。这里所说的查询缓存失效是指的只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此可能你废了很大的劲把结果存起来,还没使用呢,就被一个更新全清空了!大家都知道数据的宝贵,由于这个致命的缺点,导致查询缓存在MySQL8.0版本的时候就被抛弃了,也就是说MySQL8.0版本彻底删除了查询缓存!

4.3 分析器

如果没有命中缓存,那就必须执行SQL语句了。这时候你所写的查询语句就到了分析器,分析器先会对SQL语句进行“词法分析”,它会分析并识别你所输入的空格、字符串和关键字都在MySQL中代表了什么,比如首先它会识别出来select关键字、表名、列名和条件。识别了SQL语句的这些后,就到了“语法分析”的阶段,它会根据MySQL的语句标准来检查你所输入的SQL语句是否符合标准。如果不符合标准就会报出一个“You have an error in your SQL syntax”的语法错误提示。

注意: 一般语法错误提示第一个你所需要关注的是紧接着“use near”的内容,因为它会告诉你哪个语法附近有错误!

4.4 优化器

能进到优化器优化环节的SQL语句,说明在分析器分析的时候没有出现任何错误。那么优化器对该SQL语句做了些什么呢?假如一个SQL语句中是有索引的,优化器会根据优化规则选择合适的索引。或者是一个语句夺标关联时,优化器决定了各个表之间的连接顺序。这里我们看一个多表连接的SQL语句:

select * from tb_user join tb_grade on tb_user.id = tb_grade.uid where tb_user.username = 'Ziph' and tb_grade.subject = 'Java';
  • 先从tb_user表中取出username=Ziph的记录ID,再根据ID关联到tb_grade表,再判断tb_grade表中的subject是否等于Java

  • 先从tb_grade表中取出subject=Java的记录ID,再根据ID关联到tb_user表,再判断tb_user表中的username是否等于Ziph

两种逻辑查询出的结果虽然是一样的,但是执行效率会有所不同,而优化器的作用就是根据自己的优化逻辑判断来决定使用哪一个方案

4.5 执行器

通过分析器知道了做什么,通过优化器知道了怎么做,这就遇到了一个问题,谁来做?可想而知就是执行器开始执行SQL语句。开始执行的时候,要先判断一下你对表是否有执行查询的权限,如果没有就会报出错误的提示信息。如果有权限,就打开表继续执行。执行器会根据表的引擎来调用提供的引擎接口,开始执行。

执行器调用引擎接口执行过程: 调用InnoDB引擎接口取这个表的第一行,判断是否符合查询条件,如果不符合则跳过,如果符合则将这行存在结果集中。以此类推,执行遍历所有行将所有满足条件的记录集作为结果集返回


在这里插入图片描述

MySQL基础架构分析的更多相关文章

  1. MySql基础架构以及SQL语句执行流程

    01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...

  2. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  3. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括wap站点.手机app站点. 一.现有公司技术人员现状: 1.熟悉asp ...

  4. MySQL基础架构之查询语句执行流程

    这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的. 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条 ...

  5. 1.MySQL基础架构

    好久没发博客了,终于又学完了一点知识并且进行了整理.就从这个MySQL系列开始继续坚持每个月产出几篇. 声明一下,这次的MySQL系列是针对已有一定基础的小伙伴的,关于SQL的使用,一些概念的介绍就不 ...

  6. MySQL基础架构

    前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询, ...

  7. MySQL运行原理与基础架构

    1.MySQL基础 MySQL是一个开放源代码的关系数据库管理系统.原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用. 2008年My ...

  8. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

  9. MySQL 基础知识(基本架构、存储引擎差异)

    前言: // MySQL 并发.异步IO.进程劫持 最近在看高性能 MySQL,记录写学习笔记: 高性能 MySQL 学习笔记(一) 架构与历史 笔记核心内容:MySQL 服务器基础架构.各种存储引擎 ...

随机推荐

  1. 2019-02-15 python接口图灵机器人(简单好玩)

    import requests import json def Run(text): url = "http://openapi.tuling123.com/openapi/api/v2&q ...

  2. (一)Log4j使用

    原文链接:https://www.jianshu.com/p/eb4ac2571c94?tdsourcetag=s_pctim_aiomsg 1.先创建个maven项目,在我们项目的pom文件中导入l ...

  3. 操作-读取excel

    xlrd 该模块主要用来读取excel 注:sheet表示的是excel的表,就是底下的工作栏 (1) 打开excel文件并获取所有sheet import xlrd # 打开Excel文件读取数据 ...

  4. 0.0---selenium+java自动化基础01---元素定位和操作

    一.定位方法 1.通过ID定位元素:driver. findElement(By.id(value)); 2.通过元素的名称定位元素: driver. findElement(By.name( val ...

  5. 为避免种族歧视,谷歌Chrome将不再使用“黑名单”等词

    GitHub 15.2k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.2k Star 的Java工程师成神之路,不来了解一下吗! 近日,美国黑人乔治‧佛洛伊德(Georg ...

  6. JavaWeb网上图书商城完整项目--day02-18.修改密码页面处理

    1.用户登陆成功之后会显示 当点击修改密码的时候,会进入下面的页面 对应的是pwd.jsp这个文件 我们把对jsp页面前段的校验都封装在pwd.js中,在jsp中引入该js文件 <%@ page ...

  7. 8、struct2解决中文乱码的方式

    首先建立一个jsp页面 列如 页面编码统一问题,这个最容易解决. <%@ page language="java" import="java.util.*" ...

  8. Programming Model

    上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Dataflow Programming Model 数据流的开发模型 Levels ...

  9. 个人作业——软件工程实践总结&个人技术博客

    一. 回望 (1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强软件工程专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪 ...

  10. Egret游戏大厅制作思路

    Egret游戏大厅制作思路 Egret中,写好的代码最终都被打包到main.js里面,只有库文件会单独生成出来,按需加载. 游戏中有需求,要将一些游戏(或者模块)进行外包,然后从主游戏大厅中进入,那么 ...