![]() |
|
Модераторы: skyboy |
![]()
|
|
| Secandr |
|
||||||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Почитав вот эти две темы:
http://forum.vingrad.ru/index.php?showtopic=110473 http://forum.vingrad.ru/index.php?showtopic=109983 Решил я оптимизировать запросы на своих сайтах. Последним был http://megara.coltel.ru Так вот, рейтинг за 7 дней обсчитывался порядка 2-5 сек. Запрос был стандартный:
Т.е. я хочу выбрать из таблицы vidio фильмы, у которых больше всего просмотров за неделю. А вот немного переделав запрос получаем выборку всего в сотые доли секунды:
Запрос отличается не сильно, а вот производительность выросла на 2 порядка! При этом результат EXPLAIN для двух запросов одинаков... Вопрос в том, почему произошло ускорение в 100 раз? Структура таблиц.
518 записей
7029 записей Это сообщение отредактировал(а) Secandr - 5.9.2006, 11:59 |
||||||||
|
|||||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Осмелюсь предположить, что ускорение получено за счет того что во втором запросе группировка происходит теперь по полю бОльшей по размеру таблицы.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
EXPLAIN'ы-то покажите
Когда LEFT JOIN, то по-любому сначала выбираются строки из левой таблицы, получается что в таблице shows у вас дофига записей, а за последние 7 дней не так много, вот и получается что в первом случае мы приджойниваем все показы для добавленных фильмов и только потом оставляем последние 7 дней. Ещё у меня большое сомнение по поводу вот этого: TO_DAYS(`as`.`datetime`)>(TO_DAYS(NOW())-7), справа константа, а слева вычисляемое поле, mysql не умеет для такого поля индекс использовать, да и вообще лишняя операция. Т.е. правильнее: 1. создать индекс по datetime 2. в where писать as.datetime > NOW() - INTERVAL 7 DAY Ну и для справки: datetime - 8 байт, timestamp - 4 байта. Т.е. лучше использовать второе. Это сообщение отредактировал(а) muzer - 5.9.2006, 18:18 |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Akina, у меня была подобная мысль...
muzer, есть ускорение от создания индекса, но не значительное: .0080 против .0071 А после замены условия .0024 Это сообщение отредактировал(а) Secandr - 5.9.2006, 21:02 |
|||
|
||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Ну правильно
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
muzer, всё же создание индекса даёт незначительную прибавку при вычислениее, около 10%
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |