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. Linux基础之终端、控制台、tty、pty简介说明

    最近在搞Linux提权的时候,有时候su 用户名 登录的时候发现登录不了,因为tty终端,交互不了,所以我也来总结一下 一. 基本概念 1. ttytty(终端设备的统称):tty一词源于telety ...

  2. 免费增加几个T电脑空间方法,拿去不谢

    大家好,我是咔咔 不期速成,日拱一卒 在刷吾爱时猛然间看到一篇帖子名为,免费增加几个T电脑空间方法,拿去不谢,作为一名电脑磁盘深度缺乏者,这种文章怎能逃离我的法眼. 点进去大概瞅了一眼,大致意思就是把 ...

  3. after effects的xml格式工程文件aepx的格式分析(一)

    表面上看,AE的工程文件可以另存为xml格式,我们可以通过直接编辑XML来做一些事情. 很可惜,通过aepx文件修改AE工程,能做到的非常有限.理由是: 1.重要的属性都放在了标签的bdata这个属性 ...

  4. 机器学习-softmax回归 python实现

    ---恢复内容开始--- Softmax Regression 可以看做是 LR 算法在多分类上的推广,即类标签 y 的取值大于或者等于 2. 假设数据样本集为:$\left \{ \left ( X ...

  5. Nginx命令(全局配置文件与模块)

    目录 一:Nginx命令 二:Nginx全局配置文件 1.nginx全局配置 2.过滤出Nginx 三:Nginx网址模块(解析) 一:Nginx命令 1.-v : 打印版本号 [root@web01 ...

  6. Java高级语法之反射

    Java高级语法之反射 什么是反射 java.lang包提供java语言程序设计的基础类,在lang包下存在一个子包:reflect,与反射相关的APIs均在此处: 官方对reflect包的介绍如下: ...

  7. JVM内存模型(五)

    一.JVM内存模型 1.1.与运行时数据区     前面讲过了运行时数据区那接下来我们聊下内存模型,JVM的内存模型指的是方法区和堆:在很多情况下网上讲解会把内存模型和运行时数据区认为是一个东西,这是 ...

  8. ApacheCN 网络安全译文集 20211025 更新

    Android 渗透测试学习手册 中文版 第一章 Android 安全入门 第二章 准备实验环境 第三章 Android 应用的逆向和审计 第四章 对 Android 设备进行流量分析 第五章 And ...

  9. 「NOI十联测」反函数

    30pts 令(为1,)为-1: 暴力枚举每个点为起始点的路径,一条路径是合法的当且仅当路径权值和为0且路径上没有出现过负数. 将所有答案算出. 100pts 使用点分治. 要求知道经过重心root的 ...

  10. sms短信网关对接

    因为工作的需求,需要对接短信网关,业务上就是一个注册用户时,需要发送手机验证码;可能别的公司都是使用第三方接口,但是大点的公司,为了安全,他们都有自己的短信消息中心(SMSC) 1.业务需求 - 1. ...