2013-12-17 4 views
0

Я пытаюсь запустить этот запрос. Это очень медленно. После 30 секунд я до сих пор не получил никаких результатов.Запрос MySql с подзапросом очень медленный

  • У меня есть указатели на шаге, source, video_id.

  • шаг 1 видео загружено

  • шаг 4 видео готово для загрузки

  • источник 5 представляет собой тип видео

В encoding_history таблице, у меня много раз одни и те же video_id с различными этапами процесса (загрузка, кодирование, ...)

Моя потребность в том, чтобы получить все видео, загруженные mo чем 6 часов назад и еще не готовы к загрузке.

Если я удаляю подзапрос, это довольно быстро.

Мой стол имеет около 6.000.000 записей.

$query = 'SELECT video_id FROM encoding_history WHERE 
video_id NOT IN (SELECT video_id FROM encoding_history WHERE step = 4 AND source = 5 GROUP BY video_id) 
AND step = 1 
AND source = 5 
AND date_added > DATE_SUB(NOW(), INTERVAL 6 HOUR)'; 

Любые идеи о том, как ускорить мои результаты? Благодарю.

+0

Попробуйте выполнить план выполнения запроса с помощью ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.5/en/explain.html). Также используйте 'SQL_NO_CACHE' при отладке. –

+0

Рассмотрите возможность использования не существует или соединение вместо подбора select и избавиться от группы путем выбора sub, не думайте, что это необходимо. – xQbert

+0

Можете ли вы изменить подзапрос, чтобы просто быть 'SELECT DISTINCT video_id FROM encoding_history WHERE step = 4 AND source = 5' (удалить группу) –

ответ

1

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

SELECT Eh1.video_id 
FROM encoding_history EH1 
LEFT JOIN Encoding_history EH2 
    on EH2.step=4 and EH2.source=5 
    and EH1.step=1 and EH1.source=5 
    AND EH1.date_added > DATE_SUB(NOW(), INTERVAL 6 HOUR) 
WHERE Eh2.Video_ID is null 

Результат: Верните все Video_IDS, которые находятся в стадии 1 с источником 5 , которые не имеют источника 5. шаг 4, которые были добавлены в течение последних 6 часов.

0

Там нет никакого способа, что видео в шаге 1 и 4 в то же время так просто избавиться от подзапроса

На другом священнике научил (благодаря xQbert) вы могли бы переместить эту операцию в приложении вместо db.

+0

Вы принимаете предположение, что таблица также не содержит исторических записей. Не зная уникального ключа, он может очень хорошо иметь записи видео на шагах 1 и 4. Учитывая попытку, показываемую OP, я предполагаю, что на самом деле они оба. но вы также можете быть правы, возможно, у него нет обоих. Автор может помочь, предоставив некоторые выборочные данные для уточнения! (заданное имя таблицы, я предполагаю, что у него есть оба) – xQbert

+0

Да, это действительно действительно – ghousseyn

+0

В то же время нет, но у того же видео_ид есть разные шаги. – zeflex

Смежные вопросы