Проблемы производительности с производной таблицей в SQL - PullRequest
0 голосов
/ 26 января 2011

У меня проблемы с использованием производной таблицы в MySQL. Замедляет ли использование производной таблицы обработку запроса?

Вот запрос, который я пытаюсь выполнить. Оно не будет выполнено и просто выйдет из строя.

Это успешно. Действительно, я выделил проблему до последнего присоединения. Когда я вынимаю последнее соединение, оно работает нормально. Но когда я добавляю последнее соединение обратно, оно отказывается выполнять.

SELECT cr.COMMUNICATIONS_ID AS ANSWER_ID, 
       cr.CONSUMER_ID as VIEWER_ID, 
       cr.ACTION_LOG_ID, 
       nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID, 
       nc.SENDER_CONSUMER_ID AS REPLIER_ID, 
       ces.EXPERT_SCORE AS REPLIER_EXPERTISE, 
       cim.CONSUMER_INTEREST_EXPERT_ID AS DOMAIN
    FROM (SELECT 234 AS CONSUMER_ID, 
    ACTION_LOG_ID, 
    COMMUNICATIONS_ID 
    FROM consumer_action_log 
    WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc ON 
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN communication_interest_mapping AS cim ON 
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_expert_score AS ces ON 
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Надеюсь, это поможет ... Вот некоторые заявления mysql CREATE INDEX.По сути, если вы можете добавлять индексы, убедитесь, что есть индекс, который охватывает каждый из ваших столбцов, которые соединяют 2 или более таблиц.

CREATE INDEX idx_nc
ON network_communications(COMMUNICATIONS_ID);

CREATE INDEX idx_cim
ON communication_interest_mapping(COMMUNICATION_ID);

CREATE INDEX idx_ces
ON consumer_expert_score(CONSUMER_ID, CONSUMER_EXPERT_ID);

Производные таблицы не являются плохими по своей сути, но в этом случае (см. Ниже) вы извлекаете все записи из consumer_action_log, для которых comm_type_id равен 4. Похоже, что нет связи с другими таблицами.Это может быть причиной того, что sql никогда не вернется.

SELECT cr.COMMUNICATIONS_ID, 
           cr.CONSUMER_ID, 
           cr.ACTION_LOG_ID, 
           nc.PARENT_COMMUNICATIONS_ID, 
           nc.SENDER_CONSUMER_ID, 
           ces.EXPERT_SCORE, 
           cim.CONSUMER_INTEREST_EXPERT_ID

    FROM (SELECT 234 AS CONSUMER_ID, 
             ACTION_LOG_ID, 
             COMMUNICATIONS_ID 
             FROM consumer_action_log 
             WHERE COMM_TYPE_ID=4) AS cr

JOIN network_communications AS nc ON 
         cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID

JOIN communication_interest_mapping AS cim ON 
         nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID

JOIN consumer_expert_score AS ces ON 
         nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;
1 голос
/ 27 января 2011

Помимо индексов, которые должны существовать в ваших таблицах поиска, как указал Джон в anser, я бы позаботился о том, чтобы у вас также был индекс COMM_TYPE_ID в вашей таблице consumer_action_log.

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

SELECT STRAIGHT_JOIN
         cr.COMMUNICATIONS_ID AS ANSWER_ID,
         cr.CONSUMER_ID as VIEWER_ID,  
         etc... rest of your query...

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

...