MySQL巨大IN集合用于巨大表

4

将其视为理论问题和实际问题。

假设有一个包含100万条用户记录的表格,并且需要仅使用user_id从该表格中提取50000个用户的数据。您认为IN操作符的行为会如何?如果不佳,是否只有这种选择,还是还有其他方法可以尝试?

4个回答

3

您可以将搜索值插入单个列临时表中,并在其上进行连接。当出现非常大的in子句时,我曾经见过其他数据库做出不好的反应。


嗯,我看不出来这是怎么可能的。user_id是唯一的,并且是where条件。他也没有指定任何其他条件...那你如何复制并加入呢?你能举个例子解释一下吗? - Anush Prem
我是指创建一个只有一列的临时表,将他感兴趣的user_id值插入其中,然后从原始表中选择*,与临时表内部连接。内部连接将从常规表中限制结果到在临时表中具有匹配ID的行。唯一性不相关。 - Chris Shain

2

IN操作的性能相当差,所以我建议避免使用它。大多数情况下,您可以通过使用连接查询来解决问题,因此根据您的数据库结构,您应该明确优先选择JOIN而不是IN语句。


3
你可能把IN (SELECT ... )IN (value1, value2, ...)混淆了。前者因为速度慢而出名,但后者正在被重写成一系列的OR语句,我认为你不能说OR语句会很慢。 - Mchl

0
如果IN开始变得麻烦(正如其他回答者所建议的那样),您可以尝试使用EXISTS重写查询。
SELECT *
    FROM MYTAB
    WHERE MYKEY IN (SELECT KEYVAL
                        FROM MYOTHERTAB
                        WHERE some condition)

可能会变成

SELECT *
    FROM MYTAB
    WHERE EXISTS (SELECT *
                      FROM MYOTHERTAB
                      WHERE some condition AND
                            MYTAB.MYKEY = MYOTHERTAB.KEYVAL)

我经常发现这样可以加快速度。


-1
使用JOIN来选择所需的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接