MySQL优化查询以增强比较报告的性能

时间:2012-11-07 14:24:18

标签: mysql database jsp

我有两张表“users”和“temp_users”。现在,“users”表包含数百万个数据,“temp_users”包含数千个。这两个表都包含相同类型的信息,但有时某些记录可能会丢失。

因此,要求是比较这两个表并显示它们之间的差异。我编写了比较查询,但可能是由于大量数据(数百万)执行时间超过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 个答案:

答案 0 :(得分:1)

两次观察:

  1. 您真的打算在where子句中加上“OR”吗?它不应该是'AND'吗?如果查询优化器由于'OR'逻辑而无法使用索引,则OR可能导致查询运行得慢得多。
  2. 您正在使用子选择而不是JOIN,这也会导致一个称为“相关子查询”的重大问题,其中子选择必须为外部选择返回的每一行执行。
  3. 上述两个问题(相关子查询与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
    

    上述查询使用ID和DATETIME执行'LEFT OUTER JOIN'连接两个表,然后将结果过滤到USERS中没有行的结果。这应该返回你想要的东西。

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

    要获得更高的速度:确保“id”,“dateTime”或两者都有索引。

    希望这有帮助!

    ...约翰