1.MySQL基础架构

好久没发博客了,终于又学完了一点知识并且进行了整理。就从这个MySQL系列开始继续坚持每个月产出几篇。

声明一下,这次的MySQL系列是针对已有一定基础的小伙伴的,关于SQL的使用,一些概念的介绍就不再这里写了。



首先我们来看一个简易的图片,学习MySQL的基础架构:

  MySQL的架构主体可分为: Server层和存储引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器。所有跨存储引擎的功能都在这一层实现。

我们先介绍一下一个查询的语句,MySQL的执行流程:

  1. 应用服务器与数据库服务器建立一个连接
  2. 数据库进程拿到请求sql
  3. 解析并生成执行计划,执行
  4. 读取数据到内存并进行逻辑处理
  5. 通过步骤一的连接,发送结果到客户端
  6. 关掉连接,释放资源

根据这个流程,我们来详细介绍每个组成的概念及意义。



 连接器:

  负责跟客户端建立连接,获取权限,维持和管理连接。通过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讲

原文地址:https://www.cnblogs.com/zhangbLearn/p/12096840.html

时间: 2024-08-30 15:44:21

1.MySQL基础架构的相关文章

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

01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password from mysql.user; 这样就可以返回一个结果,但却不知这条语句的内部执行流程. 如下是mysql的逻辑架构图: Mysql可以分为Server层和存储引擎层二部分. Server层有连接器/缓存/分析器/优化器/执行器,涵盖了mysql的很多核心功能. 存储引擎层负责数据的存储和读取,支

MySQL基础架构

前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询,增加,删除,索引,锁,触发器,视图等内容.几乎没有基础的架构知识.因此在这里巩固一下原理,学习一下数据库Mysql在原理上究竟是怎样的. 首先我们一起看一个Mysql的基本架构示意图: 1.Mysql可以分为Server层和存储引擎层两部分. 2.Server层:包含连接器,查询缓存,分析器,优化器,执行器等

MySQL基础实战

一.数据库基础: DBMS:数据库管理系统(Database Management System) RDBMS:关系数据库管理系统(Relational Database Management System) C/S:通过专有协议 关系模型:表(行,列),二维关系 范式:第一范式,第二范式,第三范式: 关系运算: 选择 投影 数据库:表,索引,视图(虚表) SQL:结构化查询语言 DDL:数据定义语言 DML:数据操作语言 编程接口: 自行定义存储过程 自行定义存储函数 触发器: 时间调度器:类

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

前言: // MySQL 并发.异步IO.进程劫持 最近在看高性能 MySQL,记录写学习笔记: 高性能 MySQL 学习笔记(一) 架构与历史 笔记核心内容:MySQL 服务器基础架构.各种存储引擎之间的主要区别,以及这些区别的重要性: 一.MySQL 逻辑架构 如图: 第一层架构图: 也就是最上层的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器的工具或者服务器都有类似的架构,比如链接处理,授权认证,安全等等 : // 每个客户端连接都会在服务器进程中拥有一个线程这连接查询只会

高性能MySQL之基础架构

一.背景 为什么我们需要先学习MYSQL的基础架构先呢? 原因很简单,当我们需要了解一件事物的时候,我们只有站在宏观的层面,才能层层剥丝抽茧的去理解问题.举个例子,我们要看一个框架的源码,一开始就想进去研究,却发现找不着北,原因很简单,因为我们没有鸟瞰全貌,我们根本不知道入口在哪里.因此我们学习MYSQL的时候也是这样.先从高纬度理解问题,最后看到里面有哪些组件,一层层的拆解,这样让我们对mysql有更深入的理解.废话不多说,我们先看总体的逻辑架构图,如下所示. 二.Mysql总体逻辑架构 从图

MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格,即客户端/服务端模式. 2.分层描述 客户端连接 通常会进行连接池管理,连接用户权限认证,安全管理等操作. 可以通过如下命令查看连接配置信息:SHOW VARIABLES LIKE '%connect%';可以看到最大连接和每个连接占用的内存等相关配置. 核心功能 第二层架构封装MySQL一系列核心

MySQL数据库的基础架构

前言 我思故我在 MySQL基础架构图 MySQL组成部分说明 ①连接器 作用:负责和客户端建立连接,权限校验,管理和维护连接,连接完成处于空闲状态. 问题:如何查看空闲列表? 答案:通过show processlist查看,在Command字段,为Sleep为空闲状态. 引申:我们知道如果客户端长时间不相应,那么会断开连接,而这个时长由wait_timeout控制,默认时间8小时. 命令:SHOW GLOBAL VARIABLES LIKE 'wait_timeout'; 注意我们在这里得到的

mysql基础和数据库的优化

Mysql基础... 4 Mysql介绍... 4 登录mysql mysql –u root –p[掌握]... 4 SQL语言... 4 DCL. 4 grant. 4 revoke. 4 DDL. 4 建库... 4 删库... 4 建表... 4 看表结构... 5 删表... 5 修改表... 5 DML[重点]... 5 增加... 5 删除... 5 修改... 5 查看... 5 排序... 5 总数... 5 求和... 5 平均... 6 最大... 6 最小... 6 表连

mysql基础补充

前言 本篇的主要内容为整理mysql的基础内容,分享的同时方便日后查阅,同时结合python的学习整理python操作mysql的方法以及python的ORM. 一.数据库初探 在开始mysql之前先了解下什么是数据库: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式.数据库有很多种类型,从最简单的存储有各种数据的表格到能够