mysql查询性能优化

目录

慢查询基础:优化数据访问

是否向数据库请求了不需要的数据

mysql是否在扫描额外的记录

访问类型

重构查询的方式

mysql执行路径

mysql客户端/服务器通信协议

查询状态

查询优化处理

查询优化器

优化策略


摘自:高性能mysql第三版

慢查询基础:优化数据访问

性能低下的最基本原因是访问的数据太多。

1.确认应用程序是否在检索大量超过需要的数据,这通常意味着访问了太多的行,但有时候也可能是访问了太多的列。

2.确认mysql服务器层是否在分析大量超过需要的数据行。

是否向数据库请求了不需要的数据

1.常见的错误是误以为mysql会只返回需要的数据,实际上mysql却是先返回全部结果集再进行计算。

解决办法是加上limit。

2.只取需要的列,不要select *,而应该是select 具体的列。

3.重复查询相同的数据,可以在初次查询的时候将数据缓存起来,需要的时候从缓存取出。

mysql是否在扫描额外的记录

衡量查询开销的指标(都会记录到mysql的慢查询日志中):

响应时间

响应时间= 服务时间+排队时间。

服务时间是数据库处理这个查询真正花了多少时间,排队时间是服务器因为等待某些资源而没有执行查询的时间(如常见的I/O和锁等待)

扫描的行数

返回的行数

理想情况下扫描的行数与返回的行数是相同的。

访问类型

explain语句中的type列反应了访问类型,如果没有办法找到合适的访问类型,那就增加一个合适的索引。

一般mysql使用以下3种方式应用where条件(由好到坏)

1.在索引中使用where过滤不匹配的记录,在存储引擎层完成

2.使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接哦那个索引中过滤不需要的记录并返回命中结果。在mysql服务器层完成

3.从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现了Using where),在mysql服务器层完成,需要先从数据表独处记录然后再过滤。

如果发现查询需要扫描大量的数据但只返回少数的行,可以通过以下优化:

1.使用索引覆盖扫描,把所有需要的用的列都放到索引中,这样存储引擎无需返回表获取对应行就可以返回结果了

2.改变库表结构,如使用单独的汇总表

3.重写这个复杂的查询,让mysql优化器能够以更优的方式执行这个查询

 

重构查询的方式

1.一个复杂查询还是多个简单查询

2.切分查询

3.分解关联查询

可以对每一个表进行一次单表查询,然后将结果再应用程序中进行关联。

mysql执行路径

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

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

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

4.mysql根据优化器生成的执行计划,调用存储引擎的api来执行查询

5.将查询结果返回客户端

mysql客户端/服务器通信协议

半双工的,再任一时刻,要么是服务器向客户端发送数据,要么是客户端要服务器发送数据,两个动作不能同时发生。

半双工的通信协议简单快速,但是无法进行流量控制,一端一旦开始发生消息,另一端要接受完整个消息才能响应。

客户端用一个单独的数据报将查询传给服务器,一旦发送了请求就只能等待结果。服务器响应给客户端的数据通常很多,由多个数据包组成。当服务器开始响应客户端请求时,客户端必须完整的接收整个返回结果。(查询一定要加上limit)。

查询状态

show full processlist

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

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

locked:在mysql服务器层,该线程正在等待表锁,在存储引擎级别实现的锁,如innodb的行锁,并不会体现在线程状态中。

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

copying to tmp table [on disk]:线程正在执行查询,并且将结果集复制到临时表中。这种状态要么是在做group by ,要么是文件排序操作,或者是union操作。如果这个状态后有on disk标记,表示mysql正在将一个内存临时表放到磁盘上。

sorting result:正在对结果集进行排序。

sending data:线程可能在多个状态之间传送数据,或者在生成结果集,或者在向客户端返回数据

查询优化处理

语法解析和预处理

1.mysql通过关键字将sql语句进行解析,并生成一棵对应的“解析树”。

mysql解析器将使用mysql语法规则验证和解析查询。

预处理器则根据一些mysql规则进一步检查解析树是否合法

2.预处理器验证权限

查询优化器

mysql使用基于成本的优化器,将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。

mysql选择错误的执行计划:

1.统计信息不准确

2.执行计划中的成本估算不等同于实际执行的成本

3.从不考虑其他并发执行的查询

优化策略

静态优化:可以直接对解析树进行分析,并完成优化

动态优化

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值