第六章 查询性能优化(上)

2020-03-08  本文已影响0人  魅猫之

为什么查询会慢?

响应时间、扫描的行数、返回的行数,是衡量查询开销的三个指标(记录在慢日志中)

怎么优化查询?

一条查询是如何执行的?

1、客户端发送一条查询给服务器

MySQL客户端和服务器之间的通信协议是“半双工”的,同一时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器端发送数据,这两个动作不能同时发生

2、服务器先检查查询缓存,如果命中缓存,则立即返回储存在缓存中的结果。否则进入下一阶段

查询的状态

Sleep:线程正在等待客户端发送新的请求

Query:线程正在查询或者正在将结果发送给客户端

Locked:服务器层等待标锁

Analyzing and statistics:线程正在收集存储引擎的统计信息,并生成查询的执行计划

Copying to tmp table [on disk]:将结果拷贝到一个临时表,要么在做GROUP BY,要么文件排序、UNION表。如果后面还有“on disk”,表示MySQL正在将一个内存临时表放到磁盘上操作

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

Sending data:线程正在传送数据

查询缓存

解析SQL语句之前,优先检查查询缓存,这是通过哈希查找实现的,如果命中缓存,那么在返回数据之前,还要检查一次用户权限

3、服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划

MySQL通过关键字对SQL语句进行解析,生成“解析树”,验证是否关键字错误、语法错误、括号是否匹配,然后验证权限

4、MySQL根据优化器生成的执行计划,调用储存引擎的API来执行查询

5、将结果返回给客户端

查询优化器

一条查询可以有很多种执行方式,最后都返回相同的结果,优化器的作用就算找到这其中最好的执行计划

MySQL如何执行关联查询

按照where条件遍历第一个表,然后循环查询第二个表,使用on的筛选;
on的条件最好要是索引

返回结果给客户端

一旦服务器处理完最后一个关联表,开始生成第一条结果时,MySQL就可以开始向客户端逐步返回结果集了;比如Java的rs.next(),一条一条取,避免服务器内存压力过大;

上一篇下一篇

猜你喜欢

热点阅读