【发布时间】:2014-10-27 04:03:18
【问题描述】:
我有两张桌子:
表 A:
Name, isPair
表 B:
Name1, Name2, Status
这是我的查询:
SELECT Name
FROM A
LEFT JOIN B ON (A.Name = B.Name2)
WHERE A.isPair = 'T' AND (B.status <> 'valid' OR B.status IS NULL)
我在两个表中都有数百万行。以目前的查询速度,完成需要 3 个多月的时间。我已经适当地索引了这两个表。当我最初执行 INNER JOIN 时,只需要 10 分钟即可完成,但我发现查询没有返回不在表 B 的 Name2 列中的行,这是一个问题,因为我需要返回它们。
【问题讨论】:
-
你加入了一个名字,我想这将是一个 VARCHAR 或一个 CHAR 列。见stackoverflow.com/questions/332300/…
-
除了@rurouni88 ...“适当地索引两个表”是什么意思?
-
@rurouni88 谢谢,但这不是缓慢的主要原因。我之前已经将这两个表与其他表进行了多次连接,查询时间不到 10 分钟。
-
@TeamTam 我已经索引了这些表。名称是唯一的。
-
这将有助于比较查询计划。如果您只想显示来自
A的列(而没有来自B的列),那么您可以尝试使用EXISTS而不是外部连接到表,尽管通常查询规划器足够聪明,可以在后面为您执行此操作场景。你能指出实际的底层数据库是 SQL Server 还是 MySQL?
标签: mysql sql left-join innodb heidisql