美文网首页
记一次Sql执行从17分钟到3秒的优化

记一次Sql执行从17分钟到3秒的优化

作者: Weidaicheng | 来源:发表于2021-02-07 10:04 被阅读0次

同事小A拿来了一段sql语句问我说为什么执行特别慢,跑一次要十多分钟。我试了一下,好家伙,最慢17分钟。语句如下:

SELECT T.*
FROM TABLE1 T
INNER JOIN VEMPLOYEE E ON E.ID = T.EID
WHERE ...;

其中TABLE1是一个数据记录表,VEMPLOYEE是一个员工表的视图,我看了一下视图定义,彻底被震惊了

CREATE OR REPLACE VIEW VEMPLOYEE AS
SELECT E.*
     FROM EMPLOYEE E
    WHERE     E.ID NOT IN
                 (53237,
                  268710,
                  51529,
                  273123,
                  267052,
                  270336,
                  273121,
                  273134,
                  273132,
                  51643,
                 --后边省略好几百行
);

小A解释说,客户要求有好多地方页面展示的时候要屏蔽一些员工,所以就直接搞了个员工视图来做统一的过滤处理。

那么,优化开始

在sql中使用IN或者NOT IN的性能是非常差的,至于具体原因,好多大佬解释的很清楚了,我就不再赘述。那么第一步,就是使用LEFT JOIN替换掉语句里边的NOT IN
首先创建一个表IGNORE_EMP_ID存储需要忽略的员工ID,只有一个ID列,修改视图创建语句如下:

CREATE OR REPLACE VIEW VEMPLOYEE AS
SELECT E.*
     FROM EMPLOYEE E
LEFT JOIN IGNORE_EMP_ID IE ON IE.ID = E.ID
    WHERE IE.ID IS NULL;

展示一下LEFT JOIN替换NOT IN的执行过程,假设EMPLOYEE表有ID为1、2、3这三个员工,需要忽略的ID有1、3这两个

表数据
执行
SELECT *
FROM EMPLOYEE E
LEFT JOIN ON IGNORE_EMP_ID IE ON IE.ID = E.ID;

时得到的数据为:

left join结果集
加上WHERE IE.ID IS NULL时就过滤掉了IGNORE_EMP_ID中的数据。

修改的方法告诉了小A,过了几分钟,我就问他改的咋样,他说正在往新建的IGNORE_EMP_ID表插数据。那好吧,我来帮忙插数据好了。
前面介绍过原来的sql里边都是一行一个数字排列的,我们把NOT IN里边的所有ID复制出来到txt文件

txt
然后保存文件为csv
另存为csv
找到刚刚保持的csv文件通过excel打开
excel
在B1单元格输入表达式
=CONCAT("INSERT INTO IGNORE_EMP_ID(ID) VALUES (", A1, ");")

然后回车拉至最后一行,复制出B列所有sql执行即可。


生成sql

相关文章

  • mysql 知识碎片

    查看优化后最终执行的sql 这两条sql要同时执行,才能通过show warnings查出优化后的sql语句。

  • sql优化

    1、 优化器 优化器(Optimizer)是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。主要有以...

  • MySQL技术专题(11)🌲优化专区-Sql优化

    一.SQL优化 1.Sql优化就是指语句在执行的时候效率不是那么乐观所以提高Sql优化就是指在数据库的执行速度的。...

  • 1.mysql性能优化

    2017.12.20 真题 请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?Sql语...

  • MySQL 优化

    SQL优化 -- 通过show status命令了解各种sql的执行效率 查看本session的sql执行效率sh...

  • MYSQL explain执行计划解读

    Explain 查看SQL语句的执行计划:分析SQL执行计划,优化SQL及索引策略,run faster. ...

  • Spark Sql 运行原理

    Spark SQL 原理和运行机制 Catalyst 执行优化器 Catalyst 是 Spark SQL 执行优...

  • 跟pagehelper源码

    前几天帮实习生做了一个优化需求,遇到了一个很奇怪的问题:sql在sql平台执行,优化前30s+,优化后不到1秒,到...

  • MySQL的SQL优化

    MySQL的SQL优化 通过 show status 命令了解各种 SQL 的执行频率 Com_select:执行...

  • MySql 优化

    SQL优化 通过show status命令了解各种sql的执行效率 结果 Com_select:执行select操...

网友评论

      本文标题:记一次Sql执行从17分钟到3秒的优化

      本文链接:https://www.haomeiwen.com/subject/yczatltx.html