我正在尝试创建高效的SQL查询,但是遇到了问题。
考虑一个包含以下3个字段的MySQL表。
产品表:
Product ID | Category ID | Orders in the Last 30 Days
还有其他领域,但对这个问题没有意义。 该表中有140,000个产品。
然后我有了另一个表,该表创建了“嵌套”类别结构。这对于这个问题可能不重要。
类别表:
Category ID | Root ID | Category Name
这将创建类别树,其中“ 0”表示根类别。 该表中大约有2500个类别。
问题:给定类别中最受欢迎的20种产品。如果没有嵌套类别,就足够简单了,但是在我的情况下,我有一个非常“嵌套”的类别结构-我想在所要求的类别以下的所有类别中提供受欢迎的产品。
我有一个perl脚本,它可以非常快速地检索位于所请求类别之下的所有类别。 然后,它形成一个如下所示的SQL查询:
在productid
='1'或products
='2'或catid
='3'的catid
中选择catid
等等等按ordersinlast30d
DESC LIMIT 0,20
如果我的“或”列表只有几个,这很好用,但是请记住,如果我要求我的“根”类别之一,或者只是要求类别“ 0”(即下面的每个类别)正在创建一个长度为2500的“或”列表。执行此操作大约需要20秒。 我真正可以等待的最大时间是50-100ms。
在我看来,数据库执行此操作的最简单方法是简单地按ordersinlast30d
对整个表进行排序,然后如果需要类别ID,则逐行进行匹配。然后在20处停止。这就是为什么我非常确定必须有一种构造此查询的有效方法的原因。我猜数据库首先要执行我所有的“ WHERE”语句,这是在花时间。
有什么想法我可以对此进行有效的SQL查询吗?
答案 0 :(得分:0)
我通过使用SQL查询优化器解决了这个问题。
为了将来参考,万一遇到任何麻烦,请使用IN而不是“ OR”
所以
SELECT `productid` FROM `products` WHERE `catid` IN (123,456,789) ORDER BY `orders30d` DESC LIMIT 0,20