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上
感谢,
答
两点意见:
- 你真的打算在你的where子句中有'OR'吗?它不应该是一个'和'?如果查询优化器由于'OR'逻辑而无法使用索引,'OR'会导致查询运行速度慢得多。
- 您正在使用子选择而不是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'或两者都有索引。
希望这会有所帮助!
约翰...
非常感谢!但我需要OR,因为它是比较ID或订购日期不包括两者的差异。但它确实有效。现在它显示得很快。 –