mysql性能优化2:深入认识mysql体系架构

栏目: 数据库 · 发布时间: 6年前

内容简介:前言本文将重点梳理mysql的体系架构,便于了解mysql的实现原理。

mysql性能优化2:深入认识 <a href='https://www.codercto.com/topics/18746.html'>mysql</a> 体系架构

前言

本文将重点梳理mysql的体系架构,便于了解mysql的实现原理。

Mysql体系结构

mysql性能优化2:深入认识mysql体系架构

  • Client Connectors 接入方 支持协议很多

  • Management Serveices & Utilities 系统管理和控制工具,mysqldump、 mysql复制集群、分区管理等

  • Connection Pool 连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求

  • SQL Interface SQL接口:接受用户的 SQL 命令,并且返回用户需要查询的结果

  • Parser 解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的

  • Optimizer 查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化

  • Cache和Buffer(高速缓存区) 查询缓存,如果查询缓存有命中的查询结果, 查询语句就可以直接去查询缓存中取数据

  • pluggable storage Engines 插件式存储引擎。存储引擎是MySql中具体的与文件打交道的子系统

  • file system 文件系统,数据、日志(redo,undo)、索引、错误日志、查询记录、慢查询等

MySQL执行流程

以mysql查询优化流程为例,mysql查询执行的路径如下图所示

mysql性能优化2:深入认识mysql体系架构

下面分步了解下每个步骤

1. mysql 客户端/服务端通信

半双工的通信方式

Mysql客户端与服务端的通信方式是“半双工”;

  • 半双工通信: 在任何一个时刻,要么是有服务器向客户端发送数据,要么是客户端向服务端发送数据,这两个动作不能同时发生。所以我们无法也无需将一个消息切成小块进行传输。

  • 特点和限制: 客户端一旦开始发送消息,另一端要接收完整个消息才能响应。 客户端一旦开始接收数据没法停下来发送指令。

注:

全双工:双向通信,发送同时也可以接收 半双工:双向通信,同时只能接收或者是发送,无法同时做操作 单工:只能单一方向传送

查询状态

对于一个mysql连接,或者说一个线程,时刻都有一个状态来标识这个连接正在做什么

查看命令 show full processlist / show processlist

注: 状态全集

https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

  • Sleep 线程正在等待客户端发送数据

mysql性能优化2:深入认识mysql体系架构

  • Query 连接线程正在执行查询

  • Locked 线程正在等待表锁的释放

  • Sorting result 线程正在对结果进行排序

  • Sending data 向请求端返回数据

mysql性能优化2:深入认识mysql体系架构

  • 可通过kill {id}的方式进行连接的杀掉

2. 查询缓存

  • 工作原理: 缓存SELECT操作的结果集和SQL语句; 新的SELECT语句,先去查询缓存,判断是否存在可用的记录集; 判断标准: 与缓存的SQL语句,是否完全一样,区分大小写 (简单认为存储了一个key-value结构,key为sql,value为sql查询结果集)

  • query_cache_type

    • 值:0 -– 不启用查询缓存,默认值;

    • 值:1 -– 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集 都可以缓存起来,供其他客户端使用,加上 SQL_NO_CACHE将不缓存

    • 值:2 -– 启用查询缓存,只要查询语句中添加了参数:SQL_CACHE,且符合查询 缓存的要求,客户端的查询语句和记录集,则可以缓存起来,供其他客户端使用

  • query_cache_size 允许设置query_cache_size的值最小为40K,默认1M,推荐设置 为:64M/128M;

  • query_cache_limit 限制查询缓存区最大能缓存的查询记录集,默认设置为1M

  • show status like 'Qcache%' 命令可查看缓存情况

不会缓存的情况

  1. 当查询语句中有一些不确定的数据时,则不会被缓存。如包含函数NOW(), CURRENT_DATE()等类似的函数,或者用户自定义的函数,存储函数,用户变 量等都不会被缓存

  2. .当查询的结果大于query_cache_limit设置的值时,结果不会被缓存

  3. 对于InnoDB引擎来说,当一个语句在事务中修改了某个表,那么在这个事务 提交之前,所有与这个表相关的查询都无法被缓存。因此长时间执行事务, 会大大降低缓存命中率

  4. 查询的表是系统表

  5. 查询语句不涉及到表

缓存是一个坑吗?

为什么mysql默认关闭了缓存开启?

  1. 在查询之前必须先检查是否命中缓存,浪费计算资源

  2. 如果这个查询可以被缓存,那么执行完成后,MySQL发现查询缓存中没有这个查询,则会将结果存入查询缓存,这会带来额外的系统消耗

  3. 针对表进行写入或更新数据时,将对应表的所有缓存都设置失效。

  4. 如果查询缓存很大或者碎片很多时,这个操作可能带来很大的系统消耗

缓存的适用场景

以读为主的业务,数据生成之后就不常改变的业务 比如门户类、新闻类、报表类、论坛类等

3. 查询优化处理

查询优化处理的三个阶段

解析sql

通过lex词法分析,yacc语法分析将sql语句解析成解析树

注:lex词法分析介绍

https://www.ibm.com/developerworks/cn/linux/sdk/lex/

预处理阶段

根据mysql的语法的规则进一步检查解析树的合法性,如:检查数据的表和列是否存在,解析名字和别名的设置。还会进行权限的验证

查询优化器

优化器的主要作用就是找到最优的执行计划

查询优化器如何找到最优执行计划

  • 使用等价变化规则 5 = 5 and a > 5 改写成 a > 5 a < b and a = 5 改写成 b > 5 and a = 5 基于联合索引,调整条件位置等

  • 优化count 、min、max等函数 min函数只需找索引最左边 max函数只需找索引最右边 myisam引擎count(*)

  • 覆盖索引扫描

  • 子查询优化

  • 提前终止查询 用了limit关键字或者使用不存在的条件

  • IN的优化 先进性排序,再采用二分查找的方式 ...

    Mysql的查询优化器是基于成本计算的原则。他会尝试各种执行计划。 数据抽样的方式进行试验(随机的读取一个4K的数据块进行分析)

执行计划

mysql性能优化2:深入认识mysql体系架构

id

select查询的序列号,标识执行的顺序 1、id相同,执行顺序由上至下 2、id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3、id相同又不同即两种情况同时存在,id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

select_type

查询的类型,主要是用于区分普通查询、联合查询、子查询等

  • SIMPLE:简单的select查询,查询中不包含子查询或者union

  • PRIMARY:查询中包含子部分,最外层查询则被标记为primary

  • SUBQUERY/MATERIALIZED:SUBQUERY表示在select 或 where列表中包含了子查询

  • MATERIALIZED表示where 后面in条件的子查询

  • UNION:若第二个select出现在union之后,则被标记为union;

  • UNION RESULT:从union表获取结果的select

table

查询涉及到的表 直接显示表名或者表的别名 由ID为M,N 查询union产生的结果 由ID为N查询生产的结果

type

访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是: system > const > eq_ref > ref > range > index > ALL

system:表只有一行记录(等于系统表), const类型的特例,基本不会出现,可以忽略不计

const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引

eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描

ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质是也是一种索引访问

range:只检索给定范围的行,使用一个索引来选择行

index:Full Index Scan,索引全表扫描,把索引从头到尾扫一遍

ALL:Full Table Scan,遍历全表以找到匹配的行

Extra

十分重要的额外信息

  1. Using filesort : mysql对数据使用一个外部的文件内容进行了排序,而不是按照表内的索引进行 排序 读取

  2. Using temporary: 使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 或 group by

  3. Using index: 表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高

  4. Using where : 使用了where过滤条件

  5. select tables optimized away: 基于索引优化MIN/MAX操作或者MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即可完成优化

其他

  • possible_keys: 查询过程中有可能用到的索引

  • key: 实际使用的索引,如果为NULL,则没有使用索引

  • rows: 根据表统计信息或者索引选用情况,大致估算出找到所需的记录所需要读取的行数

  • filtered: 它指返回结果的行占需要读到的行(rows列的值)的百分比,表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

4. 查询执行引擎

调用插件式的存储引擎的原子API的功能进行执行计划的执行

5. 返回客户端

1、有需要做缓存的,执行缓存操作

2、增量的返回结果:开始生成第一条结果时,mysql就开始往请求方逐步返回数据,这样做有如下两个 好处:

  • mysql服务器无须保存过多的数据,浪费内存

  • 用户体验好,马上就拿到了数据

如何定位慢sql

什么时候需要考虑慢sql

1、业务驱动

2、测试驱动

3、慢查询日志

慢查询日志配置

show variables like 'slow_query_log' set global slow_query_log = on set global slow_query_log_file = '/var/lib/mysql/gupaoedu-slow.log' set global log_queries_not_using_indexes = on set global long_query_time = 0.1 (秒)

慢查询日志分析

mysql性能优化2:深入认识mysql体系架构

Time :日志记录的时间

Use r@Host:执行的用户及主机

Query_time:查询耗费时间

Lock_time 锁表时间 Rows_sent 发送给请求方的记录 条数

Rows_examined 语句扫描的记录条数

SET timestamp 语句执行的时间点

select .... 执行的具体语句

慢查询日志分析工具

mysqldumpslow -t 10 -s at /var/lib/mysql/gupaoedu-slow.log

其他工具 mysqlsla pt-query-digest

mysql性能优化2:深入认识mysql体系架构

总结

本文重点介绍了mysql的体系架构,从中可以了解到一条sql的执行路径:1.建立连接--> 2.查询缓存-->3.查询优化处理(解析,预处理,优化器)--> 4.查询执行引擎--> 5.返回处理结果 这些都是mysql的内部处理,理解此流程有助于理解mysql的实现原理。

下一篇将重点梳理下mysql中的各种执行引擎。

mysql性能优化2:深入认识mysql体系架构


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Machine Learning

Machine Learning

Kevin Murphy / The MIT Press / 2012-9-18 / USD 90.00

Today's Web-enabled deluge of electronic data calls for automated methods of data analysis. Machine learning provides these, developing methods that can automatically detect patterns in data and then ......一起来看看 《Machine Learning》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具