Проблемы с производительностью с полученной таблицей в SQL

StackOverflow https://stackoverflow.com/questions/4807472

  •  24-10-2019
  •  | 
  •  

Вопрос

У меня проблемы с использованием полученной таблицы в 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;
Это было полезно?

Решение

Надеюсь, это поможет ... вот некоторые MySQL создать индексные операторы. По сути, если вы можете добавить индексы, убедитесь, что есть индекс, который покрывает каждый из ваших столбцов, которые подключают 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;

Другие советы

Помимо индексов, которые должны существовать в ваших таблицах поиска, как указано в Anser John, я бы также убедился, что у вас есть индекс на 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, на которую я предоставил ссылку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top