【发布时间】:2011-05-29 17:16:03
【问题描述】:
我最近一直在尝试使用 Redis 和 MongoDB,似乎经常会在 MongoDB 或 Redis 中存储 id's 数组。因为我在询问 MySQL IN 运算符,所以我会坚持使用 Redis 来回答这个问题。
我想知道在 IN 运算符中列出大量 (300-3000) 的 id 的性能如何,看起来像这样:
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
想象一下像 products 和 categories 表这样简单的东西,您通常可以将它们连接在一起以从某个 获取 products类别。在上面的示例中,您可以看到在 Redis (category:4:product_ids) 中的给定类别下,我从 id 4 的类别中返回所有产品 id,并将它们放在上述 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-ing 从查询内部将其添加到 25?
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 25)
非常感谢任何建议/反馈!
【问题讨论】:
-
我不确定您要问什么?一个“id IN(1,2,3, ...3000))”的查询比 3000 个“id = value”的查询快。但是使用“category = 4”的连接会比上述两个都快。
-
对,但由于一个产品可以属于多个类别,我不能执行“category = 4”。使用 Redis,我将存储属于某个类别的产品的所有 id,然后对其进行查询。我想真正的问题是,与
products_categories的 JOIN 表相比,id IN (1,2,3 ... 3000)的性能如何。还是你说的是这个? -
请小心 MySql stackoverflow.com/questions/3417074/…中的那个错误
-
当然,这没有理由不应该像任何其他检索索引行的方法一样有效;这仅取决于数据库作者是否对其进行了测试和优化。就计算复杂度而言,我们将在最坏的情况下对
IN子句进行 O(n log N) 排序(这甚至可能在您展示的排序列表上是线性的,具体取决于算法),然后是线性的交点/查找。
标签: mysql sql performance operators