sql оптимизация запроса для набора данных IMDB - PullRequest
1 голос
/ 26 мая 2020

Пожалуйста, помогите мне оптимизировать следующий запрос SQL с помощью подзапроса:

 SELECT TRIM(MC.PID) ACTOR_PID      ,TRIM(MD.PID) DIRECTOR_PID,
 COUNT(DISTINCT TRIM(MD.MID)) AS           NUM_OF_MOV_1

 FROM M_Cast MC,M_Director MD
 WHERE TRIM(MC.MID)= TRIM(MD.MID)
 GROUP BY ACTOR_PID,DIRECTOR_PID

В настоящее время его выполнение занимает более 2 минут. С помощью подзапроса я должен сделать это ниже 1 м.

1 Ответ

0 голосов
/ 26 мая 2020

Прежде всего вы должны использовать явное соединение. Нет, это сильно влияет на производительность, но это просто хорошая привычка:

SELECT TRIM(MC.PID)                    ACTOR_PID,
       TRIM(MD.PID)                    DIRECTOR_PID,
       COUNT(DISTINCT TRIM(MD.MID)) AS NUM_OF_MOV_1
FROM M_Cast MC join 
     M_Director MD on (TRIM(MC.MID) = TRIM(MD.MID))
GROUP BY ACTOR_PID, DIRECTOR_PID

Во-вторых, вы должны хранить данные, чтобы вам не приходилось использовать TRIM() как часть JOIN. Для этого сначала исправьте старые данные:

UPDATE M_Cast SET MID=TRIM(MID);
UPDATE M_Director SET MID=TRIM(MID);

, а затем убедитесь, что все будущие вставки уже обрезаны. После этого вы должны добавить соответствующие индексы.

ALTER TABLE M_Cast ADD INDEX (MID);
ALTER TABLE M_Director ADD INDEX (MID);

Это должно значительно улучшить ваш запрос.

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

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