我有两个表“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
谢谢,
最佳答案
两个观察:
- 您真的打算在您的 where 子句中使用“OR”吗?不应该是'AND'吗?如果查询优化器由于“或”逻辑而无法利用索引,“或”可能会导致查询运行得更慢。
- 您使用的是子选择而不是 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' 或两者都有索引。
希望这对您有所帮助!
约翰...
关于MySQL 优化查询以增强比较报告的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271678/