记一次慢查询优化sql
sql语句优化(慢查询日志)
最近,旧系统向新系统迁移工程刚刚结束。开发完成后,测试阶段也是好好休息了一把。接到一个需求,由于内部员工使用的网站部分功能加载时间很长,所以需要去优化系统的一些功能。大致流程如下:
部分网页查询较慢,考虑在数据库中开启慢查询,查看慢查询sql日志(写慢sql开启命令,各命令参数)
慢查询是mysql提供的,一种用来监控执行时间超过阈值的sql语句。本质上是一种日志记录。可以将日志记录到文件种,也支持将日志记录到表中。但不需要查看慢查询sql的时候不建议开启,会对性能有一定影响。
配置:
临时配置:重启数据库后会将慢查询恢复成默认状态
show variables like '%slow_query_log%';(查看慢查询开启状态)
show variables like '%long_query_time%'; (查看慢查询时间配置)
show variables like '%query%';(查看慢查询日志更全参数)set global slow_query_log='ON';(设置慢查询开启状态)
set global slow_query_log_file='/var/lib/mysql/instance-1-slow.log';(给输出的日志设置路径)
set global long_query_time=2;(设置慢查询时间,执行时间大于等于该参数的sql会被记录到日志中。时间默认为10,可根据需求进行设置)
ps:如果设置完以后没有变化,可以尝试重连数据库。
永久配置:
在mysql的配置文件中进行修改
/etc/mysql/conf.d/mysql.cnf
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/instance-1-slow.log
long_query_time = 2(时间默认为10,可根据需求进行设置)ps:如果设置完以后没有变化,可以尝试重连数据库。
参数:
start_time :开始时间,通过该参数,配合系统出问题的时间。
long_query_time:该sql 的执行时间
rows_sent:发送的结果数
rows_examined:查询扫过的行数
sql语句
分析sql,从哪几方面考虑进行优化
SELECT IFNULL(SUM(total.cityPayMoneySum),0) AS cityPayMoneySum,total.cityCode as cityCode
FROM (
SELECT pay_sum_money AS cityPayMoneySum , city_code AS cityCode
FROM TD_R_DEPT_GOODS_DAY_TRADE_SUM
inner join TD_S_DEPARTMENT on dept_code = TD_S_DEPARTMENT.code
WHERE TD_S_DEPARTMENT.company_code = 'TDSCPY15416539690705' AND TD_S_DEPARTMENT.valid = 1
UNION ALL
SELECT -refund_sum_money AS cityPayMoneySum, city_code AS cityCode
FROM TD_R_DEPT_GOODS_DAY_TRADE_REFUND_SUM
inner join TD_S_DEPARTMENT on dept_code = TD_S_DEPARTMENT.code
WHERE TD_S_DEPARTMENT.company_code = 'TDSCPY15416539690705' AND TD_S_DEPARTMENT.valid = 1) AS total
Group BY total.cityCode; sql的含义:从每日支付表(TD_R_DEPT_GOODS_DAY_TRADE_SUM)中查询交易额和城市code,从每日退款表(TD_R_DEPT_GOODS_DAY_TRADE_REFUND_SUM)中查询退款额和城市code,然后合并结果集。
根据网上查到的一些优化sql的资料,大多数是建立索引,替换某些关键字之类的操作。在我这次优化的语句中并不适用
方案一:将长复杂的sql拆分为多个短且易读的sql,拆分子查询(子查询消耗性能)。
方案二:使用left join union right join 来代替mysql中没有的full join(mysql不支持full join 。通过left join union right join 来实现full join)
方案三:将每日交易额进行汇总,改为每月交易汇总,这样每一个月就会少三十条数据。两百万条数据会少很多
方案四:最终在线上查看执行时间是union all导致的(早就该在线上看的),将3s的查询增加到了10s。最终考虑新建一个表来记录支付表和退款表的数据
,并写为存储过程供定时任务调用(公司代码原因做存储过程,可酌情参考)。
记一次慢查询优化sql的更多相关文章
- 记一次神奇的sql查询经历,group by慢查询优化
一.问题背景 现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下: 我在测试环境构造了500万条数据,模拟了这个慢查询. 简单来说,就是查询一定条件下, ...
- 数据库查询优化-SQL优化
1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默 ...
- 记一次简单的SQL优化
原来的sql是这样写的 SELECT d.ONSALE_BARCODE, d.ONSALE_NAME, c.ONSALE_ID, CAST( , ) ) AS CUSTOMARY_PRICE, CAS ...
- 记一次T-SQL查询优化 索引的重要性
概述 在一次调优一个项目组件的性能问题时,发现SQL的设计真的是非常的重要,所以写一篇博文来记录总结一下. 环境介绍 这个项目组件是一个Window服务,内部在使用轮循机会在处理一个事件表中的事件,将 ...
- 记一个常见的ms sql server中取第N条记录的方法
前言 好好学习,天天向上. 正文 好像也是一个不难的问题,刚视频里看到的,就记一下吧. 下面是表中原始的数据结构,做了一个倒叙排序: select * from Employee order by S ...
- 记一次简单的sql注入
什么是sql注入攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影 ...
- mysql 查询优化~sql优化通用
一 简介:今天我们来探讨下SQL语句的优化基础 二 基础规则: 一 通用: 1 避免索引字段使用函数 2 避免发生隐式转换 3 order by字段需要走索引,否则会发生filesor ...
- 性能测试 | 记一次生产数据库sql由451s优化为0.4s的过程
概述 最近开发说某个接口跑的很慢,排查了下发现其中一条sql,数据量不大,但居然要跑451s,下面简单记录一下优化的过程. 问题sql SELECT l.location_gid ENUMVALUE, ...
- 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录
开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...
随机推荐
- fastjson字符串转JSON的$ref问题
先说结论: fastjson在把对象转换成字符串的时候,如果遇到相同的对象的时候,默认开启引用检测将相同的对象写成引用的形式. 官网文档:https://github.com/alibaba/fast ...
- 校招——面试(Android岗)总结
PS:持续更新,未完待续 2016.8.24某为面试 自我介绍一下 链表和数组的区别 数组的存储空间是静态.连续分布的,初始化过大会造成空间浪费,过小会使空间溢出:链表的存储空间是动态分布的,只要内存 ...
- 【Java】GUI实现贪吃蛇
[Java]GUI实现贪吃蛇 前言 我们在做这个小游戏之前,得确保自己的AWT和Swing有一定的基础,并且会写一些简单的逻辑操作.这些都会在后面写的时候体现出来. 狂神老师从这里开始讲贪吃蛇的 我们 ...
- STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 【小记录】arm64下的原子加
1.代码中使用atomic_add aarch64下面并没有任何关于atomic的头文件 编译出现错误: /Users/ahfu/code/android/android-ndk-r14b/toolc ...
- 一文读懂HarmonyOS服务卡片怎么换肤
作者:zhenyu,华为软件开发工程师 关注HarmonyOS的小伙伴肯定对服务卡片已经很熟悉了.服务卡片(也简称为"卡片")是FA(FeatureAbility,元服务)的一种界 ...
- gin中从reader读取数据数据
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" &quo ...
- ansible roles实践——安装nginx
1.创建roles 在/etc/ansible/roles目录下 1.1 手动创建需要的目录 1.2 使用命令创建,用不到的目录可以创建为空目录,但不可以不创建. 创建目录[root@master] ...
- Nginx全面介绍 什么是Nginx?
目录 一:Nginx全面讲解 1.简介: 2.nginx的用武之地 3.关于代理(解析含义作用) 二:正向代理 三:反向代理 四:项目应用场景 五:正向代理与反向代理区别 1.正向代理 2.反向代理 ...
- ZooKeeper 授权访问
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...