MySQL优化查询以提高性能比较报告

问题描述:

我有两个表“users”和“temp_users”。现在,“用户”表包含数百万的数据,“temp_users”包含数千个数据。这两张表都包含相同的信息,但有时可能会丢失一些记录。MySQL优化查询以提高性能比较报告

因此,要求是比较这两个表,并显示它们之间的差异。我编写了比较查询,但可能由于数据量巨大(数百万),执行时间超过5分钟。任何建议?

比较查询,我写的是如下:

SELECT 
    id, 
    dateTime, 
    phone, 
    address 
FROM 
    tempUsers t1 
WHERE NOT EXISTS (
    SELECT id,dateTime 
    FROM users t2 
    WHERE t1.id = t2.id 
    OR t1.dateTime=t2.dateTime 
) 

该系统是在JSP和MySQL开发并部署在Apache Tomcat上

感谢,

两点意见:

  1. 你真的打算在你的where子句中有'OR'吗?它不应该是一个'和'?如果查询优化器由于'OR'逻辑而无法使用索引,'OR'会导致查询运行速度慢得多。
  2. 您正在使用子选择而不是JOIN,并且还会导致一个称为“相关子查询”的重大问题,其中子选择必须针对外部选择返回的每一行执行。

上述两个问题(与OR条件相关的子查询)可能是导致问题的原因。

尝试下面的查询,而不是:

SELECT 
    t1.id, 
    t1.dateTime, 
    t1.phone, 
    t1.address 
FROM 
    tempUsers t1 
LEFT OUTER JOIN 
    users t2 
ON 
    t1.id = t2.id 
    AND t1.dateTime=t2.dateTime 
WHERE 
    t2.id IS NULL 

上述查询执行“LEFT OUTER JOIN”使用ID和DATETIME加入两个表,然后对结果进行过滤,只有那些在没有行中USERS。这应该返回你想要的。

如果'OR'条件确实是您需要的逻辑,那么在'ON'子句中更改它,但要做好准备,以免对查询速度产生负面影响。

如需更多速度:确保'id','dateTime'或两者都有索引。

希望这会有所帮助!

约翰...

+0

非常感谢!但我需要OR,因为它是比较ID或订购日期不包括两者的差异。但它确实有效。现在它显示得很快。 –