结合2个MySQL查询以提高性能

时间:2015-12-28 12:07:08

标签: mysql sql

我有以下2个查询。 首先是根据一些连接找到一些product_id。它运行得很快。

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

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列表非常长,使得此查询需要很长时间才能执行。

有没有办法使用连接或其他方式重写第二个查询或两者结合以提高性能?

1 个答案:

答案 0 :(得分: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