2009-11-17 4 views
1

OK Итак, у меня есть этот список продуктов, которые находятся в корзине. Я пытаюсь извлечь все связанные предметы в предметы в корзине, не вытаскивая предметы, которые находятся в корзине.MySql: Почему этот запрос работает так медленно?

Я написал этот запрос, и он тянет именно то, что я хочу, но его выполнение займет 8 секунд.

SELECT * FROM cart_product 
WHERE product_id 
IN(
    SELECT product_related_related_id FROM `cart_product_related` 
    WHERE product_related_product_id 
    IN (5401,5402,4983,5004) 
) 
AND product_id 
NOT IN(5401,5402,4983,5004) 

Показаны строки 0 - 2 (3 всего, запрос взял 7.9240 сек)

Есть ли какой-нибудь способ, которым я могу оптимизировать это, чтобы сделать его работать быстрее?

Спасибо!

+1

Трудно ответить на это, не видя схемы таблиц. (Например, мы не знаем, какие индексы вы настроили и т. Д.) –

ответ

9

Вы должны заменить подзапрос JOIN, он должен ускорить процесс.

Что-то вроде этого:

SELECT DISTINCT cart_product.* FROM cart_product 
    INNER JOIN cart_product_related ON product_id = product_related_related_id 
WHERE product_related_product_id IN (5401,5402,4983,5004) 
    AND product_id NOT IN(5401,5402,4983,5004) 
+0

Отлично, спасибо! –

0

Попробуйте добавить индекс на product_related_product_id и product_id, если вы уже не имеете их. Если у вас нет большого количества данных, я могу только догадываться, что в настоящее время у вас нет индексов в этих полях.

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

CREATE INDEX idxProductRelatedProductId ON cart_product (INT);

что-то вдоль этих линий. У меня нет доступа к mysql 5 и он не использовал его некоторое время, но это должно быть близко.

Смежные вопросы