MySQL ORDER BY убивает мой SQL-запрос - PullRequest
1 голос
/ 04 августа 2011

У меня есть несколько таблиц с информацией о видео.Мне нужно объединить эти три таблицы и получить нужные столбцы, а затем отсортировать их по самым последним (временная метка Unix).В столбце видео содержится 1,2 миллиона записей, в video_data - более 8 миллионов записей, а в трубе - всего 22 записи.

Этот запрос работает нормально без части ORDER BY:

SELECT vd.video_id, vd.tube_id, v. *, t.tube_title, t.tube_domain FROM video_data vd ПРИСОЕДИНЯЙТЕСЬ к видео v ON vd.video_id = v.video_id ПРИСОЕДИНЯЙТЕСЬ к каналу t vd.tube_id = t.tube_id LIMIT 100

Вышеупомянутый запрос занял 0,0002 с

Однако, как только я хочу отсортировать по метке времени, выполняется 4-5 минут, если он не был сброшен серверомfirst.

ВЫБРАТЬ vd.video_id, vd.tube_id, v. *, t.tube_title, t.tube_domain FROM video_data vd РЕАЛЬНОЕ видео v ON vd.video_id = v.video_id ПРИСОЕДИНЯЙТЕСЬ к трубке t ON vd.tube_id = t.tube_id ORDER BY v.date_timestamp DESC LIMIT 100

Приведенный выше запрос занял 272,9157 с

Я добавил индексв поле v.date_timestamp, чтобы увидеть, поможет ли это, но, очевидно, это не так.Может быть, в любом случае указывать этот столбец бессмысленно?Любая помощь была бы великолепна, я все еще довольно новичок в SQL ...

Ответы [ 4 ]

0 голосов
/ 04 августа 2011

Повторите это объединение, чтобы наименьший стол был первым - это хорошая привычка.

SELECT vd.video_id, vd.tube_id, v.*, t.tube_title, t.tube_domain 
FROM tube t
INNER JOIN video_data vd
  ON vd.tube_id = t.tube_id
INNER JOIN video v
  ON v.video_id = vd.video_id
 ORDER BY v.date_timestamp DESC LIMIT 100

Могу поспорить, что это поможет, так как видеоданные не будут загружаться до тех пор, пока не будут введены 22 записи, поэтому общий набор результатов будет намного меньше. Кроме того, неплохо показать INNER JOIN, если вы этого хотите.

0 голосов
/ 04 августа 2011

Позитивно, но я считаю, что проблема может заключаться в том, что, хотя у вас есть индекс для video.date_timestamp, ваш запрос должен сначала попасть в каждую запись video_data, чтобы ПРИСОЕДИНИТЬСЯ к видео.

Вы должны увидеть значительное ускорение, отменив нормализацию следующим образом: дублируйте поле date_timestamp в таблице video_data и индексируйте / отсортируйте по нему вместо эквивалентного в видео.

0 голосов
/ 04 августа 2011

Прежде всего, я считаю, что ваш индекс бесполезен, если вы используете DESC - по крайней мере, я видел такие заявления.

В любом случае, вы можете подумать о том, чтобы сделать что-то вроде этого:

SELECT... FROM (ВЫБРАТЬ video_id, tube_id FROM video_data ORDER BY timestamp LIMIT 100) как vd INNER JOIN ...

возможно будет быстрее.главное - это предел 100 :)

0 голосов
/ 04 августа 2011

Попробуйте запустить EXPLAIN SELECT … и посмотрите, что MySQL говорит: http://dev.mysql.com/doc/refman/5.0/en/explain.html.

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

Может быть, http://hackmysql.com/case3 тоже помогает?

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