mysql服务器架构
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服务器架构的更多相关文章
- MySql服务器逻辑架构
一.MySql服务器逻辑架构图 每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安 ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- mysql 逻辑架构
1.mysql是基于网络的客户端/服务器架构,服务器上层是连接线程,解析器,查询缓存,下层是存储引擎. 2.每个客户端连接,服务器都有一个对应的线程,这个线程只为这个连接查询服务,高版本的mysql支 ...
- MySQL 主从架构配置详解
无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...
- Windows平台网站图片服务器架构的演进[转]
构建在Windows平台之上的网站,往往会被业内众多架构师认为很“保守”.很大部分原因,是由于微软技术体系的封闭和部分技术人员的短视造成 的.由于长期缺乏开源支持,所以只能“闭门造车”,这样很容易形成 ...
- QQ游戏百万人同时在线服务器架构实现
转载自:http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口,向着 ...
- 高性能mysql主存架构
原文:高性能mysql主存架构 MySQL Replication(Master与Slave基本原理及配置) 主从mysql工作原理: 1:过程: (1)Mysql的复制(replication)是一 ...
- mysql的架构
和其他数据库相比,mysql有点与众不同,它的架构可以在多种不同场景中应用并发挥好的作用,而理解其设计是发挥好作用的先决条件 每当我们在想起mysql的逻辑架构师,我们可以构造一副mysql各组件之间 ...
- Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)
什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...
随机推荐
- Visual Studio Code 学习记录
Visual Studio Code的官方文档可以学到很多知识,不只是vs code的用法,包括一些语言的入门 和一些概念等等.很好的文档. ※,user.settings.json中的一些配置说明: ...
- HTTP一、HTTP介绍与套接字
目录 一.套接字 1.HTTP与Apache 2.应用层协议:HTTP 3.套接字(IP+协议端口的组合) 4.套接字图示 5.套接字相关知识点 二.HTTP 一.套接字 1. ...
- 移动端布局:视口viewport的理解
移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...
- N!中末尾有多少个0
问题:先从100!的末尾有多少零 => 再推广到 任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一 ...
- ECharts常用设置记录
一.配置文档 http://echarts.baidu.com/option.html#title 二.属性配置 1.图表与边框容器距离. grid: { top: '10%', left: '70' ...
- spring 单元测试方法及其错误整理
spring 单元测试及其错误整理 目录: NO1 spring单元测试方法 - NO1.1 pom.xml文件中确认有下面依赖 - NO1.2 在需要测试的类上,或者新建的测试类上添加注解 - NO ...
- Redisson碰到的问题
最近开发环境使用redisson(版本是2.8.0),在部署一段时间(半个小时左右),获取分布式锁会报超时异常(org.redisson.client.RedisTimeoutException: R ...
- python 分片、截断序列
200 ? "200px" : this.width)!important;} --> 介绍 这篇文章主要介绍python对序列的分片方法.通过分片规则可以很简单的处理一些复 ...
- Git使用详细教程(4):git rm使用详解
我们使用git rm 文件名来进行删除文件的操作. git rm index.php这个命令把工作区的index.php删除并暂存了. 如何撤回已暂存的删除命令? 上图中已经给出了提示,使用git r ...
- Kali学习笔记40:SQL手工注入(2)
上一篇讲到可以通过注入得到数据库中所有的表信息 而SQL注入能不能做数据库之外的事情呢? 读取文件: ' union select null,load_file('/etc/passwd') -- 为 ...