2014-05-14 108 views
0

需要帮助加快此查询。当p.article IN ('200101')中只有一篇文章时,查询运行时间为0.0006秒。如果两篇文章在p.article IN ('200101','200102')中,则查询运行时间为0.6414秒。为多个IN优化mysql子查询

因为我需要运行这个约3000项上的查询,我想加快一点点。我认为解决方案是在INNER JOIN中,但一直无法自己弄清楚。

SELECT p.article, (
    SELECT s.final_item 
    FROM `structure` s 
    WHERE s.item = p.article 
    ORDER BY s.level DESC 
    LIMIT 1 
) AS final_item 
FROM products p 
WHERE p.article IN ('200101','200102') 
+0

你对'structure.item'的指数? – Barmar

+0

@Barmar是的,我有 – mend

+0

为什么你需要运行查询3000次?如果给定的查询是查询1,query2会是什么样子? – Lennart

回答

1

首先,您应该为表格产品中的文章和表格结构中的项目建立索引。

如果你总是在结构上至少有一行给定产品,你可以给这一个尝试:

SELECT s.final_item, p.article 
    FROM `structure` s INNER JOIN products p ON s.item = p.article 
    WHERE s.article IN ('200101','200102') 
    ORDER BY s.level DESC 
    LIMIT 1 
+0

谢谢。限制1现在已经过时,但其他代码帮助我解决了这个问题。 – mend

+1

不客气,但...为什么现在LIMIT 1已过时?我认为你需要检索给定产品的结构中最深的节点。如果没有,可能有更好的方法来编码它。此外,重要的是要知道是否保证产品中的每一篇文章都至少有一个匹配的结构行。 – Fernando

+0

你是对的。限制1仍然是必要的。结果的第一页只有1个结果,因此我得到了错误的印象。 – mend