假设您有以下查询:
SELECT * FROM table1 WHERE table1.id IN (1, 2, 3, 4, 5, ..., 999999)
条款中项目数量的合理最大值是多少IN
?我正在使用 Sphinx 生成全文搜索结果并将 ID 插入 MySQL 查询。这是一种可接受的方式吗?
假设您有以下查询:
SELECT * FROM table1 WHERE table1.id IN (1, 2, 3, 4, 5, ..., 999999)
条款中项目数量的合理最大值是多少IN
?我正在使用 Sphinx 生成全文搜索结果并将 ID 插入 MySQL 查询。这是一种可接受的方式吗?
您还可以让 IN 子句获取查询结果,例如:
SELECT * FROM table1
WHERE table1.id IN
(
SELECT id from table2
)
这样,您不需要生成包含所有可能值的文本字符串。
在 mysql 中,您应该能够在 IN 子句中放入任意数量的值,仅受“max_allowed_packet”值的约束。
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
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) ...
.
它看起来像这个主题的副本: https ://stackoverflow.com/a/4275704/838712
在提供的答案中,很明显规范中没有官方限制,而是取决于您的 DBMS 配置。
根据我的经验,子句中的最大值是 1000 个值IN ('1',....,'1000')
,我的 excel 表中有 1300 个值,我将它们全部放入 IN ,MySQL 仅返回 1000 个。