2011-10-12 2 views
0

У меня есть корзина, которая постоянно регистрирует медленные запросы, как этот ...Mysql Оптимизация медленных запросов

# Query_time: 4 Lock_time: 0 Rows_sent: 50 Rows_examined: 454403 
    SELECT SQL_CALC_FOUND_ROWS products.*, 
          descr1.product       AS product, 
          Min(prices.price)      AS price, 
          GROUP_CONCAT(IF(products_categories.link_type = 'M', 
          Concat(products_categories.category_id, 
          'M'), products_categories.category_id)) AS 
          category_ids, 
          cscart_seo_names.name     AS seo_name 
FROM cscart_products AS products 
     LEFT JOIN cscart_product_descriptions AS descr1 
     ON descr1.product_id = products.product_id 
      AND descr1.lang_code = 'EN' 
     LEFT JOIN cscart_product_prices AS prices 
     ON prices.product_id = products.product_id 
      AND prices.lower_limit = 1 
     INNER JOIN cscart_products_categories AS products_categories 
     ON products_categories.product_id = products.product_id 
     INNER JOIN cscart_categories 
     ON cscart_categories.category_id = products_categories.category_id 
      AND (cscart_categories.usergroup_ids = '' 
        OR Find_in_set(0, cscart_categories.usergroup_ids) 
        OR Find_in_set(1, cscart_categories.usergroup_ids)) 
      AND cscart_categories.status IN ('A', 'H') 
     LEFT JOIN cscart_seo_names 
     ON cscart_seo_names.object_id = products.product_id 
      AND cscart_seo_names.TYPE = 'p' 
      AND cscart_seo_names.dispatch = '' 
      AND cscart_seo_names.lang_code = 'EN' 
WHERE 1 
     AND products.company_id = 0 
     AND (products.usergroup_ids = '' 
       OR Find_in_set(0, products.usergroup_ids) 
       OR Find_in_set(1, products.usergroup_ids)) 
     AND products.status IN ('A') 
     AND prices.usergroup_id IN (0, 0, 1) 
GROUP BY products.product_id 
ORDER BY descr1.product ASC 
LIMIT 1300, 50; 

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

Спасибо,

Крис Эдвардс

+0

'EXPLAIN' - ваш лучший друг – meze

ответ

1

Я вижу много проблем с этим запросом, что может быть причиной медлительности ...

Прежде всего, в любом месте вы используете «FIND_IN_SET», попробуйте используя вместо этого IN. Удаляя «или» в условиях, индексы могут быть использованы:

cscart_categories.usergroup_ids = '' 
OR FIND_IN_SET(0, cscart_categories.usergroup_ids) 
OR FIND_IN_SET(1, cscart_categories.usergroup_ids) 

становится:

cscart_categories.usergroup_ids IN ('', '0', '1') 

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

Еще одно предложение - удалить «GROUP_CONCAT» и выбрать эту информацию отдельно в другом запросе.

+0

И вы ошибаетесь. Ваше предложение не эквивалентно. – Karolis

+0

Вы правы в том, что первая часть не работает ... функция IN не будет работать вместо функции FIND_IN_SET. Единственный способ оптимизировать это, о котором я знаю, - это удалить условия OR и вместо этого использовать UNIONS для каждого условия. – Seth

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