WHere条款需要更长的时间

时间:2013-11-28 16:42:58

标签: mysql

我正在使用这个查询下面它花了很多时间在5分钟左右..它疯了..还有更好的方法吗?或者说因为这么长时间..甚至将它切割成较小的查询n得到值n然后找到共同的值比这快得多。

SELECT Product_ItemID
FROM Product_ItemProperties
LEFT JOIN Product_Items USING (Product_ItemID)
WHERE
    Product_CatalogueID = 'xx' AND 
    Field = 'brandname' AND 
    MATCH (Value) AGAINST ('xx' IN BOOLEAN MODE) AND 
    Product_ItemID IN (Select Product_ItemID
                       FROM Product_ItemProperties
                       Where Field = 'xx' AND
                             Match (Value) AGAINST ('xx' IN BOOLEAN MODE)
                      );

2 个答案:

答案 0 :(得分:0)

我不知道为什么在你正在制作Field = 'brandname'的第一个where子句和在Field = 'xx'过滤的第二个内部where子句中。无论如何,当你应该使用它时,你会双重选择Product_ItemProperties

试试这个:

   SELECT 
Product_ItemID
FROM
Product_ItemProperties
    LEFT JOIN
Product_Items USING (Product_ItemID)
WHERE
Product_CatalogueID = 'xx'
    AND Field = 'brandname'
    AND MATCH (Value) AGAINST ('xx' IN BOOLEAN MODE)
    AND Field = 'xx';

答案 1 :(得分:0)

看起来你的itemProperties表有相同“Product_ItemID”的多个条目,你正在寻找既是“BrandX”又有一些不同值的“OtherProperty”的东西。要处理这个问题,您可以使用该表TWICE(如果您感兴趣的更多属性值,则可以使用更多...我建议您在Product_ItemProperties表上使用(Product_ItemID,Field,Value)索引,以便最好地优化查询。

例如,您正在寻找汽车品牌“X”,其次,它是一辆“蓝色”汽车(不考虑目录组件)。

此外,请注意,在此查询中,我给出了简化的别名,并使用alias.field限定每个字段,因此没有歧义哪个字段来自哪里。

外部WHERE子句是您的第一个标准,只获取具有最少品牌名称字段的那些项目,并且它与您期望的值匹配...从这些项目再次加入产品项目属性表,但是对于您感兴趣的“其他”字段值及其值。

我不确定cataglog组件在哪里,但我怀疑这是来自产品表,应该调整IT别名。

SELECT 
      ByBrand.Product_ItemID,
      P.NameOfProduct, (just an example to get this too)
   FROM
      Product_ItemProperties ByBrand
         JOIN Product_Items P
            ON ByBrand.Product_ItemID = P.Product_ItemID
         JOIN Product_ItemProperties ByOtherField
           ON ByBrand.Product_ItemID = ByOtherField.Product_ItemID
           AND ByOtherField.Field = 'otherPropertyInterestedIn'
           AND MATCH (ByOtherField.Value) against ( 'otherValueLookingFor' IN BOOLEAN MODE )
   WHERE
         ByBrand.Product_CatalogueID = 'someCatalogID'  (or is this from product_items table)
      AND ByBrand.Field = 'brandname'
      AND MATCH (ByBrand.Value) against ( 'brandValueLookingFor' IN BOOLEAN MODE )