当我输入查询时:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3 and A.T4 = B.T4
mysql挂起。但是,当我摆脱其中一个约束时:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3
mysql 几乎立即返回结果。为什么是这样?
当我输入查询时:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3 and A.T4 = B.T4
mysql挂起。但是,当我摆脱其中一个约束时:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3
mysql 几乎立即返回结果。为什么是这样?
您正在以非常缓慢和低效的方式执行此操作。它与 AND 子句本身无关,而与表的设计方式以及您尝试执行查询的方式有关。
尝试以下方式:
SELECT A.T1, B.T2
FROM A
JOIN B ON B.T3 = A.T3 AND A.T4 = B.T4
此外,为了进一步提高性能,请将列最多的表放在 FROM 子句中,而不是 JOIN 中。
此外,由于它是一组如此庞大的表,您应该考虑对它们进行索引。
CREATE INDEX index_name
ON A (T4)
GO
CREATE INDEX index_name2
ON B (T4)
GO
您只需要创建一次索引!您无需在每次运行查询时都执行此操作。 一般来说,一旦你创建了索引,你就不需要再担心它了。
最常见的是,当这种情况发生时,它与约束本身无关,而是与约束与索引的关系有关。查看关于表上已定义索引的 WHERE 子句。WHERE 子句的顺序也会产生影响。
如果可以,请尝试从 SQL-1 类型的 JOIN 转向更可见和更灵活的 SQL-2 类型。请参阅 madburn 的回答。