MySQL IN子句:最大参数数

时间:2012-10-01 01:12:42

标签: mysql

假设您有以下查询:

SELECT * FROM table1 WHERE table1.id IN (1, 2, 3, 4, 5, ..., 999999)

IN子句中的项目数的合理最大值是多少?我正在使用Sphinx生成全文搜索结果并将ID插入MySQL查询。这是一种可以接受的方式吗?

4 个答案:

答案 0 :(得分:13)

您还可以让IN子句获取查询结果,例如:

SELECT * FROM table1 
WHERE table1.id IN 
    (
   SELECT id from table2
    )

这样,您就不需要生成包含所有可能值的文本字符串。

在mysql中,你应该可以在IN子句中放入任意数量的值,只能用“max_allowed_pa​​cket”的值来约束。

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet

答案 1 :(得分:1)

根据我的经验,第webview.loadData(html_code,"text/html",null); 条中的最大值为1000, 我的excel工作表中有1300的值,我将它们全部放入IN,MySQL仅返回1000。

答案 2 :(得分:0)

它看起来像是该主题的重复: https://stackoverflow.com/a/4275704/838712

在提供的答案中,很明显规范没有正式限制,而是取决于您的DBMS配置。

答案 3 :(得分:0)

MariaDB(在我的情况下为10.3.22)在创建物化临时表之前,对IN()的参数限制为999,这可能导致执行时间更长。根据您的索引。我还没有找到控制这种行为的方法。 MySQL 5.6.27没有此限制,至少没有〜1000参数。 MySQL 5.7可能具有相同的“功能”。

我最终做了一系列where id = a or id = b ...,但是通过使用一系列where id in(a, b) or id in(c, d) ...也可以正常工作。