Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Дана следующая таблица:
Неактивен
На вскидку. У вас не используются индексы. В этом вы можете убедиться посмотрев explain вашего запроса. Для исправления этой ситуации нужно добавить составной индекс KEY(N_STATUS,N_ID).
Рекомендую прочитать тему http://sqlinfo.ru/forum/viewtopic.php?id=151
Неактивен
vasya написал:
На вскидку. У вас не используются индексы. В этом вы можете убедиться посмотрев explain вашего запроса. Для исправления этой ситуации нужно добавить составной индекс KEY(N_STATUS,N_ID).
Рекомендую прочитать тему http://sqlinfo.ru/forum/viewtopic.php?id=151
Как показывала практика, идекс KEY(N_STATUS,N_ID) не сильно помогал.
Для этого счас разбиение на 2 таблицы идет, t_video (статусы все кроме = 1) и t_video_activ (статус = 1)
Но сейчас из-за этого разбиения возникается ряд проблем, как миниумм с N_ID.
Есть какие то еще идеи на этот счет?
Неактивен
Не нравится конструкция LIMIT 99999, 10
В этом случае даже при наличии индекса MySQL придется прочитать 100009 строк и потом откинуть ненужные. Единственный способ избежать этого - переписать запрос, изменив условие выборки, чтобы сразу перейти к нужной записи, т.е. WHERE N_STATUS = 1 AND N_ID < 99999 ORDER BY N_ID DESC LIMIT 10
Неактивен
Да! Хорошая идея, спасибо!
Еще есть идея разбить на партиции эту таблицу, как лучше всего разбить (и есть ли смысл?) ? по статусам? Там записей с id_status=1 будет на много больше чем с другими статусами и выборка по ним будет на много чаще.
Неактивен
Идей, как я понимаю нет ни у кого? :-)
Неактивен
Partitioning имеет смысл делать тогда, когда Вы ожидаете, что будет происходить prunung
на каких-то запросах (ну или для увеличения скорости вставки в таблицу). В Вашем случае
с неимоверным LIMIT, это никак не скажется на производительности, единственное, что
окажется полезным, — научиться создавать партицированные таблички
Неактивен
Большое спасибо за ответы, буду эксперементировать
Неактивен
Еще вопрос по оптимизации одной выборки:
Нужно выбрать 10 видео-файлов отсортированных по рейтингу (GLOB_RATING) с заданной категорией (+ у которых статус = 1).
Для этого существует описанная в первом посте таблица t_video и таблица t_video_cat:
Отредактированно warl555 (06.09.2009 09:17:29)
Неактивен
А зачем Вам тут левое объединение? Кажется, обычное тут по логике лучше.
Ну и explain покажите
Неактивен
paulus написал:
А зачем Вам тут левое объединение? Кажется, обычное тут по логике лучше.
Ну и explain покажите
Да, тут, действительно left join не нужен:
Неактивен
По логике все делается правильно, единственное, я бы сортировал не все данные, а только
id, потом ограничивал уже количество строк и вытаскивал данные:
SELECT *
FROM t_video_cat
JOIN (SELECT N_ID FROM ... ) tt USING N_ID
Если Вы уверены, что нужные строки будут вверху t1, то можно попробовать указать MySQL
в явном виде, как искать и как отсеивать данные (но если не уверены — можете сделать
медленнее):
SELECT STRAIGHT_JOIN *
FROM t_video t1 JOIN t_video_cat t3 ON ..
(другой порядок, чтобы искало по t_video и выбирало сразу в нужном порядке, но, возможно,
выбирало лишние данные, которые потом будут выброшены).
Неактивен