1

我有两个表“ 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中

谢谢,

4

1 回答 1

1

两个观察:

  1. 您真的打算在 where 子句中使用“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

上面的查询使用 ID 和 DATETIME 执行“LEFT OUTER JOIN”来连接两个表,然后将结果过滤到仅在 USERS 中没有行的那些。这应该返回你想要的。

如果“OR”条件确实是您需要的逻辑,则在“ON”子句中更改它,但要做好准备,它可能会对查询速度产生不利影响。

为了提高速度:确保“id”、“dateTime”或两者都有索引。

希望这可以帮助!

约翰...

于 2012-11-07T15:37:03.620 回答