mysql是最广泛使用的开源数据库之一,作为后端开发人员,或多或少都会和mysql打交道,本篇文章会从sql查询语句的执行过程,来介绍mysql的服务器架构,

查询的过程大致分为从客户端到服务器,在服务器上解析,生成执行计划,执行,并返回结果给客户端。如下图1.1所示。

图1.1 sql查询执行路径

1.1 连接器

连接器对客户端的连接请求进行用户名和密码的验证,并会管理连接池。客户端和服务器为“半双工”通信协议,客户端和服务器无法同时发送消息,当服务器向客户端发送查询结果时,必须全部返回,客户端不能主动停止,mysql需要等所有的数据都发送给了客户端才会释放本次查询所占用的资源,因此大多数库函数都会接收结果并缓存在客户端,以使查询早点结束,减轻服务端压力。

对于连接到mysql的客户端,可以用show full processlist查看连接状态,该状态表示了mysql当前在做什么,一个查询完整的生命周期,状态会变很多次。

在show full processlist中,字段command表示线程正在执行的命令类型,The type of command the thread is executing,一般就是休眠(sleep),查询(query),连接 (connect),含义如下:

  • sleep,线程正在等待客户端发送新的请求。
  • query,线程正在执行查询或将结果返回客户端。
  • connect,正在建立连接。

show full processlist最重要的字段是state,Most states correspond to very quick operations. If a thread stays in a given state for many seconds,there might be a problem that needs to be investigated.An action, event, or state that indicates what the thread is doing,表示线程处于某一状态下具体正在做什么,值的含义如下:

  • Locked,在Mysql服务器层,线程正在等待锁,这里不包括innodb存储引擎实现的行锁
  • Analyzing and statistics,线程正在收集存储引擎的统计信息,并生成查询的执行计划。
  • Copying to tmp table [on disk],线程正在执行查询,并将结果放在临时表,带有on disk,表示mysql在将内存临时表存入磁盘。
  • Sorting result,线程正在对结果集排序。
  • Sending data,线程正在多个状态间传送数据,或者在生成结果集,或者向客户端返回数据。

1.2 查询缓存

在解析sql语句之前,mysql会从查询缓存中获取数据,具体是一个大小写敏感的哈希查找,sql语句必须和缓存中的sql语句完全匹配,否则不会命中,对于更新比较频繁的数据库,经常会导致缓存失效,建议将查询缓存关闭。

1.3 分析器

假如查询缓存没有命中,则会进入分析器,对sql语句进行词法和语法分析,并会进行预处理,以便知道此sql语句是要做什么。它会验证是否使用错误的关键字,关键字顺序是否正确等。并且,预处理会根据一些规则对解析树的合法性进行进一步校验,比如检查数据表和列是否存在,解析名字和别名,看看是否有歧义等,如下图1.2经常遇到的语法错误就在这一阶段

图1.2 sql语法错误提示

1.4 优化器

sql语句经过分析器分析合法,需要经过查询优化器转化成执行计划,查询优化器解决的是怎么做的问题,相同的sql语句,返回相同的结果集,有很多种执行方式,查询优化器就是要选择性能较好的一种。

mysql是基于成本的优化器,会预测一个查询使用某种计划时的成本,并选择其中成本最小的一种,可以通过Last_query_cost值查询到当前会话查询的成本。很多原因会导致mysql优化器选择错误的执行计划,比如:统计信息不准、不考虑其他并发执行的查询,执行计划太多,无法估算所有的计划等。

1.5 查询执行引擎

查询执行引擎根据优化器生成的执行计划(执行计划是一种数据结构,而不是字节码),调用存储引擎接口,完成执行计划中的所有操作。mysql将查询结果返回客户端是一个增量、逐步返回的过程。开始生成第一条结果,mysql就可以开始向客户端返回数据。这样做服务端无需存储太多结果,减小了服务端内存的消耗压力,另外,客户端也可以第一时间获得返回的结果。

mysql服务器架构的更多相关文章

  1. MySql服务器逻辑架构

    一.MySql服务器逻辑架构图         每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安 ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. mysql 逻辑架构

    1.mysql是基于网络的客户端/服务器架构,服务器上层是连接线程,解析器,查询缓存,下层是存储引擎. 2.每个客户端连接,服务器都有一个对应的线程,这个线程只为这个连接查询服务,高版本的mysql支 ...

  4. MySQL 主从架构配置详解

    无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...

  5. Windows平台网站图片服务器架构的演进[转]

    构建在Windows平台之上的网站,往往会被业内众多架构师认为很“保守”.很大部分原因,是由于微软技术体系的封闭和部分技术人员的短视造成 的.由于长期缺乏开源支持,所以只能“闭门造车”,这样很容易形成 ...

  6. QQ游戏百万人同时在线服务器架构实现

    转载自:http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口,向着 ...

  7. 高性能mysql主存架构

    原文:高性能mysql主存架构 MySQL Replication(Master与Slave基本原理及配置) 主从mysql工作原理: 1:过程: (1)Mysql的复制(replication)是一 ...

  8. mysql的架构

    和其他数据库相比,mysql有点与众不同,它的架构可以在多种不同场景中应用并发挥好的作用,而理解其设计是发挥好作用的先决条件 每当我们在想起mysql的逻辑架构师,我们可以构造一副mysql各组件之间 ...

  9. Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

    什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...

随机推荐

  1. [swarthmore cs75] Compiler 3 – Cobra

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第5次大作业. 增加了bool数据表示和比较运算符的支持,具体语法参考下图: 第一种int和bo ...

  2. Vue两种组件类型介绍:递归组件和动态组件

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...

  3. java 的原码、补码、反码小总结

    先看一个代码吧: int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 这个应该很熟悉吧,是 ja ...

  4. 解决Ubuntu自带编译器不好使问题

    解决Ubuntu自带编译器不好使问题 1.删除Ubuntu自带的tiny版本,这个版本用起来很别扭不好使. 2.安装full版本的vim 3.显示效果:full版本. 之前自带的版本:

  5. C++反汇编(一)

    对象/结构体 对象的大小只包括数据成员,成员函数属于执行代码. 对象长度 = sizeof(数据成员1) + sizeof(数据成员2) + ...... + sizeof(数据成员n) 特殊情况公式 ...

  6. 【设计经验】4、SERDES关键技术总结

    一.SERDES介绍 随着大数据的兴起以及信息技术的快速发展,数据传输对总线带宽的要求越来越高,并行传输技术的发展受到了时序同步困难.信号偏移严重,抗干扰能力弱以及设计复杂度高等一系列问题的阻碍.与并 ...

  7. libgdx学习记录3——动画Animation

    libgdx动画采用Animation实现,即通过帧动画实现. 代码如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAd ...

  8. IDEA远程Debug

    进行远程debug是我们排查线上bug的一个最常用的工具,本篇博文就简单介绍一下如何使用IDEA来进行远程debug 1. 修改Tomcat配置文件 修改bin目录下的catalina.sh文件,在文 ...

  9. swiper轮播在ie浏览器上遇到的显示问题探索

    前言: 最近项目有一个需求,想要下图效果,鼠标指向头像图片,图片会放大同时上面的轮播会跟着切换: 鼠标移开头像图片,图片变回原来的大小 注:下图是我根据上面需求已经实现的效果,所以截图方便说明 思考: ...

  10. redis5.0新特性

    1. redis5.0新特性 1.1. 新的Stream类型 1.1.1. 什么是Stream数据类型 抽象数据日志 数据流 1.2. 新的Redis模块API:Timers and Cluster ...