我正在进行查询,以查找与历史条目表中的记录匹配的新条目表中的记录,其中匹配可以在许多字段之一上。换句话说:
“显示所有记录,其中current.id = archive.id或current.name = archive.name或current.address = archive.address”
此查询的SQL如下:
SELECT current.id, current.name, current.address FROM current
INNER JOIN archive
ON
current.id = archive.id OR
current.name = archive.name OR
current.address = archive.address
当我运行它时,它需要FOREVER,这是第一次加载数据;存档将始终有大约300,000条记录,但当前将在500到40,000之间波动。
有没有更好的方法来编写此查询?或者,我的查询是否可靠,但我的基础数据库可能有问题?
答案 0 :(得分:4)
在每个表中的3个字段上创建索引可能会有所帮助(特别是在存档表中,如果它非常大),但请尝试这样做:
SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
current.id = archive.id
UNION
SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
current.name = archive.name
UNION
SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
current.address = archive.address
此查询允许您单独索引字段(您仍应该这样做),从而导致索引可能更小,整体性能更佳。
在连接条件中使用OR可能会使查询优化器陷入困境,可能会使其处于次优状态。 UNION
是昂贵的,但更有可能的是您的查询时间花在了联接上,并且简化这可能会有很大帮助。