как избежать using temporary table в случае group by и inner join

Тема в разделе "Базы данных", создана пользователем babahalki, 16 окт 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    250
    Симпатии:
    91
    Привет.
    Пытаюсь оптимизировать долгие запросы. Таблица 7.5млн. строк, к которой делается inner join.

    Код:
    SELECT SQL_NO_CACHE po.feature_id, po.value, po.translit
    FROM t_cat3_options po
    INNER JOIN s_products_categories pc ON pc.product_id = po.product_id
    AND pc.category_id
    IN (
    '5', '14', '47', '6', '8', '132', '10', '11', '16', '7', '62', '93', '9', '12', '13', '18', '94', '37', '17', '48', '150', '15', '25', '20', '95', '143', '147', '19', '138', '148', '4'
    )
    WHERE 1
    AND po.lang_id = '1'
    AND po.feature_id
    IN (
    '25', '2', '9', '13', '16', '24', '17', '18', '19', '20', '21', '22', '26', '31'
    )
    GROUP BY po.feature_id, po.value
    ORDER BY NULL
    
    Это сам запрос. Можно ли вообще в таком случае добиться исключения temporary table?


    Вопрос снимается. Вот решение:

    Код:
    SELECT SQL_NO_CACHE pos.* from
    (
      SELECT  po.feature_id, po.value, po.translit, po.product_id
    FROM t_cat3_options po
    
    WHERE 1
    
    AND po.lang_id = '1'
    AND po.feature_id
    IN (
    '25', '2', '9', '13', '16', '24', '17', '18', '19', '20', '21', '22', '26', '31'
    )
    
    
    GROUP BY po.feature_id, po.value
    ORDER BY NULL
    ) pos
    
    INNER JOIN s_products_categories pc ON pc.product_id = pos.product_id
    AND pc.category_id
    IN (
    '5', '14', '47', '6', '8', '132', '10', '11', '16', '7', '62', '93', '9', '12', '13', '18', '94', '37', '17', '48', '150', '15', '25', '20', '95', '143', '147', '19', '138', '148', '4'
    )
    
    Используется 2 составных индекса
    в таблице po:
    feature_id value translit category_id lang_id product_id
    в таблице pc:
    category_id, product_id



    EXPLAIN

    Extra


    Using where; Using index

    NULL

    Using where; Using index


    К сожалению так получается криво. Группировать до join нельзя. Непременно нужно сделать сначала join, потом только group by.

    Ничего лучше, как сделать гигантскую таблицу, где join уже выполнен, в голову не пришло.
     
    Последнее редактирование: 16 окт 2016
    latteo нравится это.
Статус темы:
Закрыта.