sql语句优化(慢查询日志)

最近,旧系统向新系统迁移工程刚刚结束。开发完成后,测试阶段也是好好休息了一把。接到一个需求,由于内部员工使用的网站部分功能加载时间很长,所以需要去优化系统的一些功能。大致流程如下:

  1. 部分网页查询较慢,考虑在数据库中开启慢查询,查看慢查询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语句

  2. 分析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的更多相关文章

  1. 记一次神奇的sql查询经历,group by慢查询优化

    一.问题背景 现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下: 我在测试环境构造了500万条数据,模拟了这个慢查询. 简单来说,就是查询一定条件下, ...

  2. 数据库查询优化-SQL优化

    1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默 ...

  3. 记一次简单的SQL优化

    原来的sql是这样写的 SELECT d.ONSALE_BARCODE, d.ONSALE_NAME, c.ONSALE_ID, CAST( , ) ) AS CUSTOMARY_PRICE, CAS ...

  4. 记一次T-SQL查询优化 索引的重要性

    概述 在一次调优一个项目组件的性能问题时,发现SQL的设计真的是非常的重要,所以写一篇博文来记录总结一下. 环境介绍 这个项目组件是一个Window服务,内部在使用轮循机会在处理一个事件表中的事件,将 ...

  5. 记一个常见的ms sql server中取第N条记录的方法

    前言 好好学习,天天向上. 正文 好像也是一个不难的问题,刚视频里看到的,就记一下吧. 下面是表中原始的数据结构,做了一个倒叙排序: select * from Employee order by S ...

  6. 记一次简单的sql注入

     什么是sql注入攻击?  所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影 ...

  7. mysql 查询优化~sql优化通用

    一 简介:今天我们来探讨下SQL语句的优化基础 二 基础规则: 一 通用: 1 避免索引字段使用函数     2 避免发生隐式转换     3 order by字段需要走索引,否则会发生filesor ...

  8. 性能测试 | 记一次生产数据库sql由451s优化为0.4s的过程

    概述 最近开发说某个接口跑的很慢,排查了下发现其中一条sql,数据量不大,但居然要跑451s,下面简单记录一下优化的过程. 问题sql SELECT l.location_gid ENUMVALUE, ...

  9. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

随机推荐

  1. Android函数抽取壳的实现

    0x0 前言 函数抽取壳这个词不知道从哪起源的,但我理解的函数抽取壳是那种将dex文件中的函数代码给nop,然后在运行时再把字节码给填回dex的这么一种壳. 函数抽取前: 函数抽取后: 很早之前就想写 ...

  2. RHCSA 第八天

    1.查询ip的几种方式: ip, ifconfig, nmcli,nmtui 2.nmcli命令使用: a.在ens160网卡上新建连接static_con,并配置静态ip b.在ens160网卡上新 ...

  3. Javascript中字符串常用方法

    JavaScript字符串常用方法 (1)获取相应位置的字符(charAt()) var str="你好,小小鸟!" var s=str.charAt(1) //获取到索引为1的字 ...

  4. 【笔记】golang中使用protocol buffers的底层库直接解码二进制数据

    背景 一个简单的代理程序,发现单核QPS达到2万/s左右就上不去了,40%的CPU消耗在pb的decode/encode上面. 于是我想,对于特定的场景,直接从[]byte中取出字段,而不用完全的把整 ...

  5. golang中json包序列化与反序列化

    package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...

  6. Ansible + shell 实现部署fastdfs+nginx 实现图片服务器并提供动态缩放功能;

    因为公司阿里服务器变动几次,手动部署了好几次fastdfs+nginx,于是就想到了自动化部署,以下为脚本内容,由于只是想把着功能实现,并未有完完整的判断逻辑: 以下为ansible-playbook ...

  7. 利用JGrapht对有向无环图进行广度优先遍历

    环境需求:JDK:1.8 jar:jgrapht-core-1.01.jar package edu; import org.jgrapht.experimental.dag.DirectedAcyc ...

  8. CF1399F Yet Another Segments Subset

    首先注意一下题面要求,使得选出的线段两两要么包含要么不相交,也就是说一条线段可能会出现不相交的几条线段,而这些线段上面也可能继续这样包含线段.然后我们可以发现我们要做的实际上是在这条线段上选取几条线段 ...

  9. Android Studio中添加对HttpClient的支持包

    感谢大佬:https://blog.csdn.net/gladiator0975/article/details/49177959 sdk6.0以后取消了HttpClient,设置android SD ...

  10. 用Java开发局域网内文件传输软件遇到的一些问题

    项目地址:https://github.com/b84955189/FileTransfer 由于巨懒的我不太喜欢使用U盘操作文件,特此开发一个简易的文件传输程序. 目前仅限局域网内传输,后期会尝试写 ...