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. centos 下Python独立虚拟环境创建

    virtualenv Python有着庞大的开源社区的支持,很自然就产生这么一个问题:第三方包参差不齐,如果我们想在服务器测试,或者升级某个包,就会导致生产环境产生杂乱,多余的第三方依赖包. virt ...

  2. 即时消息Toast和对话框

    public static Toast makeText(Context context, CharSequence text, int duration) protected void onDest ...

  3. Exp9 Web安全基础

    Exp9 Web安全基础 20154305 齐帅 一.实验要求 本实践的目标理解常用网络攻击技术的基本原理. Webgoat实践下相关实验: [目录] [第一部分 WebGoat 8.0] 1.Web ...

  4. xtrabackup单表备份与恢复

    官网最新版本下载地址 https://www.percona.com/downloads/XtraBackup/LATEST/ yum install percona-xtrabackup; [epe ...

  5. 逻辑回归 vs 决策树 vs 支持向量机(I)

    原文链接:http://www.edvancer.in/logistic-regression-vs-decision-trees-vs-svm-part1/ 分类问题是我们在各个行业的商业业务中遇到 ...

  6. 换PHP7后访问Apache虚拟站点Forbidden的问题解决

    Httpd.conf中,注释掉前2行,补上后2行 <Directory /> #AllowOverride none #Require all denied Order deny,allo ...

  7. 浅谈如何检查Linux中开放端口列表

    给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...

  8. 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践

    1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...

  9. Javascript高级编程学习笔记(39)—— DOM(5)Comment

    Comment类型 顾名思义,comment类型指的就是注释节点在HTML文档中的类型 也就是说平时我们在代码中的注释,在HTML解析的时候也会被解析为一类节点 让我们可以根据这些节点进行一系列的操作 ...

  10. Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量

    私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...