2015-12-28 3 views
0

У меня следующие 2 запросов. Первый находит некоторые product_id s на основе некоторых объединений. Он работает быстро.Объединить 2 MySQL запросов для повышения производительности

SELECT Group_concat(DISTINCT(p.products_id)) AS comma_separated 
FROM products p 
     left join specials s 
       ON p.products_id = s.products_id 
     left join products_to_categories p2c 
       ON p.products_id = p2c.products_id 
     left join products_description pd 
       ON p.products_id = pd.products_id 
     inner join products_attributes pa 
       ON p.products_id = pa.products_id 
WHERE p.products_status = '1' 
     AND Date_sub(Curdate(), interval 7000 day) <= p.products_date_added 
ORDER BY p.products_id DESC 

После этого, следующий запрос выполняется, и использовать все products_id S найдено в первом запросе:

SELECT DISTINCT pov.products_options_values_id, 
       pov.products_options_values_name, 
       pa.options_values_price, 
       pa.price_prefix 
FROM products_attributes pa, 
     products_options_values pov 
WHERE Find_in_set(pa.products_id, 
'**Long list of comma separated products_ids found in the first query**') 
AND pa.options_id = 1 
AND pa.options_values_id = pov.products_options_values_id 
AND pov.language_id = '1' 
GROUP BY pov.products_options_values_id 
ORDER BY pov.products_options_values_sort_order ASC 

Список products_id с в пункте Find_in_set очень долго и делает этот запрос занять довольно много времени.

Есть ли способ использования объединений или другого способа переписать второй запрос или объединить оба для повышения производительности?

+5

Я думаю, вы должны изменить свой вопрос и объяснить, что вы пытаетесь сделать, а также иметь образцы данных и желаемые результаты. –

+0

Хотя первый запрос можно использовать в качестве подзапроса во втором ('... WHERE Find_in_set (pa.products_id, SELECT Group_concat (DISTINCT (p.products_id)) AS comma_sepa ...ions_values_sort_order ASC)) .. .), но очень сложно сказать, какой эффект он будет оказывать на производительность. – Piskvor

+0

Спасибо @ GordonLinoff, я думаю, что запросы довольно просты и понятны, и вопрос совершенно ясен. Ответ mnv ниже прибил его, теперь он занимает менее 5% времени, затраченного до этого: – CreativeMind

ответ

2

Попробуйте что-то вроде этого

SELECT DISTINCT pov.products_options_values_id, 
       pov.products_options_values_name, 
       pa.options_values_price, 
       pa.price_prefix 
FROM products_attributes pa, 
     products_options_values pov, 
     (SELECT p.products_id 
      FROM products p 
        left join specials s 
          ON p.products_id = s.products_id 
        left join products_to_categories p2c 
          ON p.products_id = p2c.products_id 
        left join products_description pd 
          ON p.products_id = pd.products_id 
        inner join products_attributes pa 
          ON p.products_id = pa.products_id 
      WHERE p.products_status = '1' 
        AND Date_sub(Curdate(), interval 7000 day) <= p.products_date_added 
      GROUP BY p.products_id 
     ) t 
WHERE t.products_id = pa.products_id 
AND pa.options_id = 1 
AND pa.options_values_id = pov.products_options_values_id 
AND pov.language_id = '1' 
GROUP BY pov.products_options_values_id 
ORDER BY pov.products_options_values_sort_order ASC 
+0

ты, мой друг, гений! : D – CreativeMind

+0

Arrgh. Вы сохранили архаичные запятые в предложении 'FROM'. –

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