2013-11-28 2 views
-1

HI Я использую этот запрос ниже его, занимая много времени вокруг, как 5 минут .. его сумасшедший .. любой лучший способ? или причина такого долгого времени .. даже разрезая его на меньший запрос n, получая значение n, тогда найти общие значения намного быстрее, чем это.WHERE предложение занимает гораздо больше времени

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

Попробуйте положить EXPLAIN перед запросом, чтобы увидеть, что индексы и не используются – Tommassiov

+1

Вы должны разделить больше, чем запрос - как на выходе 'EXPLAIN', таблицы схем, Qty записей/отношения и т. д. – AgRizzo

ответ

0

я не знаю, почему в первом пункте, где вы делаете Field = 'brandname' и во второй внутренней, где положение вы фильтрации по Field = 'xx'. в любом случае вы дважды выбираете 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'; 
0

Похоже, ваши itemProperties таблица имеет несколько записей для одной и той же «Product_ItemID», и вы ищете что-то, что является как «BrandX», и имеет некоторые «OtherProperty» из другое значение. Чтобы справиться с этим, вы можете использовать эту таблицу TWICE (или больше, если больше значений свойств, которые вас интересуют ... Я бы предложил иметь индекс в вашей таблице Product_ItemProperties по (Product_ItemID, Field, Value), чтобы лучше всего оптимизировать запрос.

Например, вы ищете автомобиль марки «X», а во-вторых, это автомобиль «Blue» (не считая компонент каталога).

Кроме того, обратите внимание, в этом запросе, я даю упрощенный алиасы и квалифицировать каждое поле с псевдонимом. Поэтому нет никакой неопределенности, из которой следует поле.

Внешнее предложение WHERE - это ваши первые критерии, только получите те предметы, которые имеют минимум фирменного наименования fi eld, и оно соответствует ожидаемому значению ... От них снова присоединяются к таблице свойств продукта товара, но для интересующего вас «другого» значения поля и его значения.

Я был не уверен, где компонент cataglog был, но я подозреваю, что это из таблицы продуктов и должен быть настроен с помощью псевдонимов.

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) 
Смежные вопросы