【问题标题】:SQL select ... in (select...) taking long timeSQL select ... in (select...) 耗时较长
【发布时间】:2012-12-05 17:26:59
【问题描述】:

我有一张用户购买的商品表,在该表中有一个类别标识符。所以,我想向用户展示同一张表中的其他商品,他们已经购买过相同的类别。

我正在尝试的查询运行时间超过 22 秒,而主要项目表甚至没有 3000 行......为什么效率如此低下?如果需要,我应该索引哪些列?

这是查询:

select * from items
    where category in (
        select category from items 
        where ((user_id = '63') AND (category <> '0')) 
        group by category
    ) 
order by dateadded desc limit 20

【问题讨论】:

  • 是的,您应该索引您将在查询中用作标识符的所有列。在此示例中,您要索引 categorydateadded,如果还没有 PK/索引:user_id
  • @BenAshton 谢谢,会尝试的 - 正如你所指出的,已经在 user_id 上进行了 PK

标签: mysql sql where-in


【解决方案1】:

这是一个查询。并确保在category,user_id,dateadded上添加索引

select i1.* 
from items i1
inner join 
(select distinct 
           category 
        from items 
        where ((user_id = '63') AND (category <> '0'))
) i2 on (i1.Category=i2.Category)


order by i1.dateadded desc limit 20

【讨论】:

  • 从 22 秒到 0.156 秒 - 非常好,非常感谢
【解决方案2】:

如有必要,放置索引的适当位置是dateaddeduser_id 和/或category

【讨论】:

  • 否,因为这只会显示用户已经拥有的项目 - 我想查看表格中的所有项目,无论他们是否拥有问题所说的 - 其他项目
  • 我认为你错过了按行分组
  • @DarrenSweeney 是的,你说得对,我读错了,现在重新读了一遍。我现在已经编辑过了。我认为“YogendraSingh”有一个很好的答案
  • @DerekOrgan 我错过了比按行分组更多的内容!
【解决方案3】:

尝试使用自连接以获得更好的性能:

 select i1.* from items i1 JOIN items i2 on i1.category= i2.category
 where i2.user_id = '63' AND i2.category <> '0'
 group by i2.category
 order by i1.dateadded desc limit 20

Join 比嵌套子查询快得多。

编辑:尝试不使用group by

 select i1.* from items i1 JOIN items i2 on i1.category= i2.category
 where i2.user_id = '63' AND i2.category <> '0'
 order by i1.dateadded desc limit 20

【讨论】:

  • 这是不正确的 - 每个类别只返回一个项目 - 因此用户从 18 个类别中购买,这仅显示 18 个结果,每个类别一个
  • @DarrenSweeney:在这种情况下,请在删除 group by 后尝试。
【解决方案4】:

如果您在category 和可能的dateadded 上建立索引,它应该会加快速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多