Перейти к содержимому

Фотография
- - - - -

Долгий запрос к базе


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 3

#1 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 03 Октябрь 2013 в 13:31

Три таблицы:

user: Содержит информацию о всех юзерах (id, логин, пол и т.д)

gallery: Содержит информацию об загруженных юзерами картинок (id, id альбома, название, путь к маленькой картинке, путь к большой картинке, приватность)

gallery_album: Содержит альбы юзеров, в которых находятся изображения

 

Задача:

Вывести на страницу НЕ приватные фотографии юзеров определенного пола.

За приватность отвечает поле privat в таблице gallery (1 - Видимо всем, 2 - Только друзьям, 3 - Определенным персонажам из другой таблицы)

 

Делаю запросы:

// Запрос для вывода изображений парней:SELECT .. FROM `gallery`JOIN `user` ON `gallery`.`id_login` = `user`.`id`JOIN `gallery_album` AS `album` ON `gallery`.`id_album` = `album`.`id`WHERE `gallery`.`privat` = 1 AND `user`.`pol` = 1ORDER BY `gallery`.`id` DESC LIMIT 5
// Запрос для вывода изображений девушек:SELECT .. FROM `gallery`JOIN `user` ON `gallery`.`id_login` = `user`.`id`JOIN `gallery_album` AS `album` ON `gallery`.`id_album` = `album`.`id`WHERE `gallery`.`privat` = 1  `user`.`pol` = 2ORDER BY `gallery`.`id` DESC LIMIT 5
// Обычный запрос и вывод всех:SELECT .. FROM `gallery`JOIN `user` ON `gallery`.`id_login` = `user`.`id`JOIN `gallery_album` AS `album` ON `gallery`.`id_album` = `album`.`id`WHERE `gallery`.`privat` = 1ORDER BY `gallery`.`id` DESC LIMIT 5

Первые два выполняются примерно ~ 7-10 секунд при 300.000 фотографиях (это ещё в основной таблице юзеров всего два пользователя только загрузил).

Как быть в данном случае? Отказаться от вывода изображений по полам?

Может быть поделить на три таблицы по приватности? gallery1 - Видимы всем, gallery2 - Только друзьям, gallery3 - Определенным персонажам. Хотя это врятле поможет, если в таблице user будет столько же пользователей. 


Сообщение отредактировал FiRеFоX: 03 Октябрь 2013 в 13:33

  • 0

Спонсор

#2 AngelGabriel

AngelGabriel

    И имя мне - легион

  • V.I.P.
  • 206
    778 сообщ.

Отправлено 03 Октябрь 2013 в 14:44

JOIN `user` ON `gallery`.`id_login` = `user`.`id`

А какой смысл этого? Что эксплаин говорит?  Privat, pol, id_login наверно индексы поставить нужно, BTREE.

 

CREATE INDEX id_l ON `gallery` (id_login) USING BTREE; и так далее


  • 0

#3 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 04 Октябрь 2013 в 05:00

А какой смысл этого? Что эксплаин говорит?  Privat, pol, id_login наверно индексы поставить нужно, BTREE.

Для вывода логина автора картинки, а также его других некоторых характеристик. И как бы условие where тоже есть по полам, а инфа о поле содержится в этой таблице..

Вот что говорит EXPLAIN:

ScreenShot006.jpg

Кстати, если убрать ORDER BY, то запрос выполняет 0.002c


Сообщение отредактировал FiRеFоX: 04 Октябрь 2013 в 05:02

  • 0

#4 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 04 Октябрь 2013 в 09:31

:)


Сообщение отредактировал FiRеFоX: 04 Октябрь 2013 в 09:34

  • 0



Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение
Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей