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