mysql - 优化sql中以下查询时间

标签 mysql sql query-optimization workbench

select *
from ((select 'Temp', r.*
       from tab1 r 
       where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab2 r1)
      ) union all
      (select 'report', r.* 
       from tab2 r 
       where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab1 r1)
      )
     ) temp
order by fa;

随着数据的增加,查询时间也在增加。即使数据不断增加,请提供优化时间的解决方案

最佳答案

所以你想要数据 A + B -(a 与 B 相交)。为此,您使用 1 个 union 和 2 个 not in 子句。我试图消除以下查询中的那些:

SELECT *
FROM(
SELECT X.*, COUNT(DISTINCT CN) OVER(PARTITION BY r.fa,r.date,r.status) CNT
FROM (
SELECT  'Temp' CN,r.* 
FROM    tab1 r 
UNION ALL
SELECT  'report' CN,r.* 
FROM    tab2 r 
)X)Y
WHERE Y.CNT=1

基本上,首先您应该使用 UNION ALL 而不是 UNION 选择所有记录。之后过滤掉两个表(tab1,tab2)中出现的记录,以便您可以使用分析功能。

关于mysql - 优化sql中以下查询时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40906837/

相关文章:

mysql - 如何从 MySQL 中选择表名称为变量的位置

MySQL group_concat 和计数

php - MySQL 错误 - 插入时出现 "You have an error in your SQL syntax"

sql - 在两个表之间有多个外键是否有意义

sql - 为什么 SQL 将精确的日期时间更改一格

mysql - 优化 MariaDB 中的 1 次 SQL 更新语句

mysql - 在 MySQL 中对非空间数据使用 R 树索引

sql-server - 执行计划上的 CTE 性能。是显示两次,还是处理了两次?

mysql - 如何将 blob 数据移动到另一个表?

MySQL - 使用另一个表中的最小日期更新表