如何检查表中是否存在数组的所有元素?

Dan*_*tos 5 mysql performance exists

让我们在应用程序级别获取一个大小为 n 的 id 数组。例如 [132,3425,13,​​13,... 392] 其中 n 大于 100k 个条目。其中一些条目是重复的。

我需要检查所有这些寄存器是否都包含在包含超过 5M 条目的 MySQL 表中。

现在我正在一个一个地检查,但是这个过程需要很长时间。

我如何在一次检查中进行此验证,或者如何提高效率。

我想知道是否所有这些都存在于桌子上,并且如果可能的话,知道该桌子上尚不存在哪些。

Ric*_*mes 4

首先计算不同数字的数量。你已经称呼它了n。然后

SELECT COUNT(*) FROM tbl
    WHERE id IN (very-long-list)
Run Code Online (Sandbox Code Playgroud)

看看是否会返回n

相反,如果您将这些数字放入另一个表中,那么这可能是最佳选择:

Table `nums` contains the `n` values.
ALTER TABLE tbl ADD INDEX(id);  -- if it does not already exist.
SELECT ! EXISTS ( SELECT * FROM nums LEFT JOIN tbl USING(id)
                      WHERE tbl.id IS NULL )
Run Code Online (Sandbox Code Playgroud)

这将检查每个nums.id以查看它是否在您的tbl. 更重要的是,当找到第一个丢失的物品时,它就会停止。输出为 1 或 0。

(“very-long-list”是“commalist”或“comma-sparated-list”)