MySQL巨表设置为巨表

MySQL巨表设置为巨表,mysql,Mysql,这既是一个理论问题,也是一个实践问题 其中一个有一个表,其中包含1.000.000+条用户记录,并且需要从该表中提取数据,例如其中的50000条,只使用用户id。你希望他表现如何?如果不好,这是唯一的选择还是可以尝试其他方法?使用连接来选择所需的数据。IN功能实际上性能非常差,因此这是我应该避免的。大多数情况下,您可以使用联接查询,因此,根据您的数据库结构,您应该明确支持联接而不是IN语句。您可以将搜索值插入到单列临时表中,并在该表上联接。我见过其他数据库在显示非常大的in子句时会做一些不好的事

这既是一个理论问题,也是一个实践问题


其中一个有一个表,其中包含1.000.000+条用户记录,并且需要从该表中提取数据,例如其中的50000条,只使用用户id。你希望他表现如何?如果不好,这是唯一的选择还是可以尝试其他方法?

使用连接来选择所需的数据。

IN功能实际上性能非常差,因此这是我应该避免的。大多数情况下,您可以使用联接查询,因此,根据您的数据库结构,您应该明确支持联接而不是IN语句。

您可以将搜索值插入到单列临时表中,并在该表上联接。我见过其他数据库在显示非常大的in子句时会做一些不好的事情。

如果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)

我经常发现这会大大加快速度。

hmm。我不明白这是怎么可能的。
user\u id
是唯一的,是where条件。他也没有指定任何其他条件。那么你将如何复制和加入它?你能用一个例子解释一下吗?我的意思是创建一个带有一列的临时表n、 在其中插入他感兴趣的用户id值,然后从原始表中选择*与临时表进行内部联接。内部联接将常规表中的结果限制为临时表中具有匹配id的行。唯一性与此无关。是否认为(选择…)中的
中的
(value1,value2,…)
。第一个确实因速度慢而臭名昭著。然而,第二个正在被重写为一系列
的代码,我认为你不能说
的速度慢。