因为=
将连接操作从每个表减少到一个匹配行(假定这些docid是唯一的)。
这样想吧-您跳了5个男孩和5个女孩的舞蹈:
Adam Alice
Bob Betty
Charly Cathy
Dick Deb
Evan Elly
您用第一个字母将它们配对。所以
Adam->Alice
Bob->Betty
etc...
一对配对
但是,如果您通过“首字母不匹配”将它们配对,则会得到以下结果:
Adam->Betty
Adam->Cathy
Adam->Deb
Adam->Elly
Bob->Alice
etc...
您已经大大增加了配对的数量。这就是为什么您的<>
查询需要这么长时间的原因。实际上,您实际上是在尝试获取m x n
行,而不是min(m,n)
。使用此数据,您最终得到25行,而不是5行。对于您指定的表大小,您正在处理77,000 * 2,700,000 = 2079亿行,减去两个ID匹配的77,000,总共207,899,923,000行联接的数据集。
根据您的查询要求,尝试左连接并查找空的右侧记录:
SELECT DISTINCT logs.DOCID
FROM logs
LEFT JOIN forms ON logs.DOCID = forms.DOCID
WHERE forms.DOCID IS NULL