Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложные запросы, быстродействие 
:(
    Опции темы
Secandr
Дата 5.9.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 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 сек.

Запрос был стандартный:

Код

SELECT `v`.`id`, count(`s`.`id`) "sid"
        FROM `vidio` `v` LEFT JOIN `shows` `s` ON `s`.`id_vidio`=`v`.`id`
        WHERE `v`.`status`="added" and TO_DAYS(`s`.`datetime`)>(TO_DAYS(NOW())-7)
        GROUP BY `v`.`id` ORDER BY sid DESC LIMIT 0,4

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

А вот немного переделав запрос получаем выборку всего в сотые доли секунды:
Код

SELECT `v`.`id`, count(`as`.`id`) "sid"
        FROM `shows` `as`LEFT JOIN `vidio` `v` ON (`as`.`id_vidio`=`v`.`id`)
        WHERE TO_DAYS(`as`.`datetime`)>(TO_DAYS(NOW())-7) and `v`.`status`="added"
        GROUP BY `as`.`id_vidio`ORDER BY "sid" DESC
LIMIT 0,4

Запрос отличается не сильно, а вот производительность выросла на 2 порядка!

При этом результат EXPLAIN для двух запросов одинаков...
Вопрос в том, почему произошло ускорение в 100 раз?

Структура таблиц.

Код

CREATE TABLE `vidio` (
  `id` bigint(20) NOT NULL auto_increment,
//* 15 полей в таблице особой роли не играют *//
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=529 ;

518 записей

Код

CREATE TABLE `shows` (
  `id` bigint(20) NOT NULL auto_increment,
  `id_vidio` bigint(20) NOT NULL default '0',
  `datetime` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7030 ;

7029 записей

Это сообщение отредактировал(а) Secandr - 5.9.2006, 11:59


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Akina
Дата 5.9.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
muzer
Дата 5.9.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



EXPLAIN'ы-то покажите smile наверняка там значения поля rows разные
Когда 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
PM WWW   Вверх
Secandr
Дата 5.9.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



Akina, у меня была подобная мысль...


muzer, есть ускорение от создания индекса, но не значительное: .0080 против .0071
А после замены условия .0024 

Это сообщение отредактировал(а) Secandr - 5.9.2006, 21:02


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
muzer
Дата 5.9.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Ну правильно smile Ускорение от создания индекса будет только в случае с правильным условием. Я же написал, что индекс не может использоваться для вычисляемого значения, т.е. если требуется не "значение индекса", а производное от него.
PM WWW   Вверх
Secandr
Дата 6.9.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



muzer, всё же создание индекса даёт незначительную прибавку при вычислениее, около 10%


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.