我有一个问题:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something
(table1包含100万条记录,执行时间:0.106秒,返回:20条记录)
另一个查询
SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse
(table2包含50万条记录,执行时间:0.078秒,返回:20条记录)
现在,如果我运行查询,请将上述两者结合起来:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something AND field1 NOT IN (SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse)
即使运行10分钟也不会给出结果。为什么它变得非常缓慢,这可能是一个潜在的解决方案。
编辑:我正在使用带有dbvisualizer 6.5的MySQL
答案 0 :(得分:1)
您不需要在子查询中使用DISTINCT
。尝试使用NOT EXISTS
,这可能在SQL-Server中更有效:
SELECT DISTINCT field1
FROM table1
WHERE field2 = @something
AND NOT EXISTS
(
SELECT 1 FROM table2
WHERE table2.similarfield1 = table1.field2
AND table2.similarfield2 = @somethingelse
)
编辑:由于您已更新了代码,因此我不确定这在MySql中是否更有效。不过,我还是更喜欢NOT EXISTS
,因为它works with NULL
values(如果您使用IS NULL
)并且更易于阅读和维护。
答案 1 :(得分:0)
我的查询和建议与@TimSchmelter类似。
事实上,你根本不应该使用distinct。首先你应该删除不同的,并检查你是否得到重复的记录,你只是问你的部分问题。表格设计不明确。
您应该毫不犹豫地发布完整的问题和查询。另外不要忘记在feild2,feild1,similarField1,similarField2上应用索引。
SELECT DISTINCT field1
FROM table1 tbl1
WHERE field2 = something
AND NOT EXISTS (
SELECT similarField1
FROM table2 tbl2
WHERE tbl1.field1 = tbl2.similarField1
AND similarField2 = somethingElse
)