2012-06-15 6 views
1

У меня есть выпадающий список, который генерируется на основе следующего SQL-запроса:Оптимизация MySQL Query НЕ


SELECT * FROM product WHERE 
    product.id NOT IN (SELECT customer_1.product_id FROM customer_1 WHERE (customer_1.product_id != '$x')) 
AND product.id NOT IN (SELECT customer_2.product_id FROM customer_2 WHERE (customer_2.product_id != '$x')) 
AND product.id NOT IN (SELECT customer_3.product_id FROM customer_3 WHERE (customer_3.product_id != '$x')); 

Проблема, которая возникает здесь время выполнения. Этот запрос сам по себе занимает около 5,3 с. У меня есть несколько других похожих запросов на одной странице.

Мой вопрос: есть ли лучший и быстрый способ достижения такого же результата?

Заранее спасибо.

ответ

2

Вы можете получить лучшую производительность от LEFT JOIN s, ища NULL в правой части соединения (таблицы customer_*). Если я правильно понимаю вашу цель, это должно сделать работу:

SELECT 
    products.* 
FROM 
    products 
    LEFT JOIN customer_1 ON products.id = customer_1.product_id 
    LEFT JOIN customer_2 ON products.id = customer_2.product_id 
    LEFT JOIN customer_3 ON products.id = customer_3.product_id 
WHERE 
    products.id != '$x' 
    AND customer_1.product_id IS NULL 
    AND customer_2.product_id IS NULL 
    AND customer_3.product_id IS NULL 
+1

спасибо. Это сделал трюк. Время выполнения сократилось до 0,7123 с. – Madi

1

Вы, вероятно, следует использовать NOT EXISTS. При правильно индексированных таблицах такая ситуация может быть значительно быстрее.

1
SELECT * FROM product Left join (SELECT customer_1.product_id FROM customer_1 WHERE (customer_1.product_id != '$x')) as t1 Left join (SELECT customer_2.product_id FROM customer_2 WHERE (customer_2.product_id != '$x')) as t2 left join (SELECT customer_3.product_id FROM customer_3 WHERE customer_3.product_id != '$x')) as t3 
And t3.product_id is null and t1.product_id is null and t2.product_id is null 
Смежные вопросы