一尘不染

MySQL“ IN”运算符在(大)数量值上的性能

mysql

我最近一直在尝试使用Redis和MongoDB,似乎经常会在MongoDB或Redis中存储 ID 数组。因为我要询问MySQL IN
运算符,所以我会坚持使用Redis 。

我想知道在IN运算符中列出大量(300-3000) id的 性能如何,看起来像这样:

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)

想象一下简单的 产品*类别 表,您通常可以将它们结合在一起以从某个 类别中 获得 产品
。在上面的示例中,您可以看到在Redis()中的给定类别下,我返回了ID为4的类别中的所有产品ID,并将其放置在运算符内的上述查询中。
*category:4:product_ids``SELECT``IN

这表现如何?

这是“取决于情况”的情况吗?还是有一个具体的“无法接受”,“快速”或“缓慢”,或者我应该添加LIMIT 25,还是没有帮助?

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
LIMIT 25

还是应该修剪Redis返回的产品ID的数组以将其限制为25,并且仅将25个ID添加到查询中而不是添加3000,LIMIT然后从查询内部将其添加到25?

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 25)

任何建议/反馈深表感谢!


阅读 1578

收藏
2020-05-17

共1个答案

一尘不染

一般而言,如果IN列表太大(对于某些“过大”的未定义值,通常在100或更小范围内),则使用联接会变得更加高效,并在需要时创建临时表。保留数字。

如果数字是一个密集的集合(没有间隙-样本数据表明),那么使用可以做得更好WHERE id BETWEEN 300 AND 3000

但是,大概在集合中存在缺口,这时最好还是使用有效值列表(除非缺口的数量相对较少,在这种情况下,您可以使用:

WHERE id BETWEEN 300 AND 3000 AND id NOT BETWEEN 742 AND 836

或任何差距。

2020-05-17