mysql 中文查询优化_Mysql查询优化-Go语言中文社区

主要介绍慢查询日志、sql的解析预处理及生成执行计划、查询各个阶段所消耗的时间等

一 如何获取有性能问题的SQL

通过用户反馈获取存储性能的sql

通过慢查询日志获取存储性能问题的sql

实时获取存在性能问题的sql

二 慢查询日志介绍

使用慢查询日志获取有性能的sql

show_query_log 启动停止记录慢查日志

show_query_log_file 指定慢查日志的存储路径及文件

long_query_time 指定记录慢查日志sql执行时间的阀值

long_queries_not_using_indexes 是否记录未使用索引的sql

慢查询日志中记录的内容

ef89723e8e7cedeb2074ad4157148dd7.png

常用的慢查日志分析工具(mysqldumpslow)

508442555185fb8a88a9915a6921a8ed.png

-t(top) 指定取前几条作为结果输出

三 如何实时获取有性能问题的sql

032d2771f67b0102225ebb2902d328ac.png

selectid,`user`,`host`,DB,comman,`time`,`state`,infofrominformation_schema.PROCESSLISTwheretime>=60;

sql的解析预处理及生成执行计划

mysql服务器处理查询请求的整个过程

1 客户端发送sql请求给服务器

2 服务器检查是否可以在查询缓存中命中该sql

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

4 根据执行计划,调用存储引擎api来查询数据

5 将结果返回给客户端

四 查询缓存对sql性能的影响

注意:每一次检查查询缓存是否可用的时候,都会锁定缓存。对于一个读写频繁的系统使用查询缓存很可能会降低查询处理的效率,所以在这种情况下建议大家不要使用查询缓存

查询缓存的设置

query_cache_type:设置查询缓存是否可用

query_cache_size:设置查询缓存的内存大小

query_cache_limit:设置查询缓存可用存储的最大值

query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据

query_cache_min_res_unit:设置查询缓存分配的内存块的最小单位

五 将sql语句转化为一个执行计划

mysql依照这个执行计划和存储引擎进行交互,这个阶段包括了多个子过程

包括检查语法是否使用了正确的关键字

关键字的顺序是否正确等

预处理阶段是根据mysql规则进一步解析树是否合法

检查查询中所涉及的表和数据列是否存在及名字或别名是否存在歧义

语法检查通过了,查询优化器就可以生成查询计划了

六 造成mysql生成错误的执行计划的原因

统计信息不准确

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

mysql优化器所认为的最有可能与你认为的最优的不一样

mysql从不考虑其他并发的查询,这可能会影响当前的查询速度

mysql有时候也会基于一些固定的规则来生成执行计划

mysql不会考虑不受其控制的成本

七  mysql优化器可优化的sql类型

重新定义表的关联顺序

将外连接转换为内连接

使用等价变换规则将(5=5 and a>5)将改写a>5

优化count(),min(),max()

将一个表达式转化为常数表达式

使用等价变换规则

子查询优化

提前终止查询

八 如何确定查询各个阶段所消耗的时间

使用profile

set profiling=1;启动profile,这是一个session级的配置

show profiles;查看每一个查询所消耗的时间

show profile for query N

九 特定SQL的查询优化

大表的修改最好分批处理

91169049c947a93b1245fd8661d9969f.png

如何修改大表的表结构

对表中的列字段进行修改,改变字段的宽度时还是会锁表,直接操作的化无法解决主从数据库延迟的问题

解决办法:先建一个表格,然后将旧表的数据同步给新表,然后删除旧表

9fa3fa5a72eb7b3cada84fb248fb1332.png

8c6badbd2d1f39d544b8598b5bcd6550.png

如何优化not in和<>查询

6d9c2d0884f63d0715c1968b50ea7c9b.png

使用汇总表优化查询

2d1480d384a56ea75bb5a26839cf34a8.png

UNINO操作用于合并两个或多个SELECT语句的结果集。默认地,UNION操作选取不同的值。如果允许重复的值,请使用UNION ALL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值