The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Не могу сделать SQL запрос быстрее, DISTINCT"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [ Отслеживать ]

"Не могу сделать SQL запрос быстрее, DISTINCT"  
Сообщение от CromaX email on 07-Ноя-08, 00:32 
MySQL + PHP

Добрый вечер. Пишу систему рейтинг TOP 100.
Данный запрос используется при просмотре списка сайтов (TOP 100) и при просмотре TOP 100 по категории(ям).

Структура такая -
domains[id,...] - сами сайты.
main[id,sid,ip....] - для каждого нового пользователя, заходящего на сайт, в эту таблицу вставляется 1 запись. т.е. Хосты. (Тут ещё хранится Разр. экрана,и др. текстовые параметры).
session[id,statid,sid], куда пишется каждый переход пользователя по сайту. statid = main.id (Хиты)
domainth[id,theme_id,domain_id] - таблица тем. сами темы в таблице themes, но она не в данном запросе не исп.

Индексы все возможные сделал на все поля (id,sid,id+sid,....) Временно, понимаю что криво, позже уберу половину, но врятли из за этого.
sid - ид сайта (domains.id)
$tids - ID тематик, через запятую, если есть.

select
  domain.id,domain.title,domain.url,
  count(DISTINCT(session.id)) as rank,
  domain.flag,domain.desc ,bnr1, bnr2
from domain
  left join session on session.sid = domain.id
  left join domainth on domainth.domain_id = domain.id
  left join banners on banners.sid = domain.id
where 1 ".(empty($tids) ? '' : " and domainth.theme_id in ($tids) ")."
  group by domain.id
  order by rank desc

Сейчас, пока кол-во записей исчесляеться сотнями, все более мение работает.
Но позже, мне кажеться, система не выдержит (Из за DISTINCTа).

Сначало было так, но данный запрос тогда не правильно счатает рейтинг (количество session.id, а показывает  чтото типа [кол-во session.id*кол-во domainth]) :
select
  domain.id,domain.title,domain.url,
  count(session.id) as rank,
  domain.flag,domain.desc ,bnr1, bnr2
from domain
  left join session on session.sid = domain.id
  left join domainth on domainth.domain_id = domain.id
  left join banners on banners.sid = domain.id
where 1 ".(empty($tids) ? '' : " and domainth.theme_id in ($tids) ")."
  group by domain.id
  order by rank desc

Мешает то, что joinю domainth. если убрать, то считает рейтинг нормально, без DISTINCT. Тоесть я её не так joinю чтоли? пробовал по разному, все равно.

Какие есть варианты -
0. Нормально присоеденять domainth (не знаю как).
1. Сделать поле rating в таблице domain. считать и сохранять туда рейтинг по крону.
но тогда статистика и рейтинг не будед realtime? А какже тогда сделанно на рамблер top 100? там в реале все, зашел на сайт, смотришь, и +1 хит сразу в статистике.

2. Посчитать перед выводом весь рейтинг всех доменов так,
select domain.id,count(session.id) as rank
    from domain
    left join session on domain.id = session.sid
    where 1 group by domain.id order by rank desc
но тогда сложно выводить потом домены, отсортированыые по рейтингу, тоесть надо делать 2 запроса, сохранять в PHP 2 массива, и потом выводить..
+ если пользователь открыл какую то категорию, то нет смысла грузить домены, которых нет в данной категории.

Прошу помощи SQL Гуру, сам не осилю.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Сделал так :"  
Сообщение от Аноним (??) on 08-Ноя-08, 20:00 
Сделал так :

select domain.id,domain.title,domain.url,count(session.id) as rank,domain.flag,domain.`desc`,bnr1, bnr2
from domain
  left join session on session.sid = domain.id
  left join banners on banners.sid = domain.id
where
domain.id IN (
              SELECT domain_id FROM domainth WHERE theme_id in (4,5,6,7,8,9))
group  by domain.id
order by rank desc;

Вложенный SELECT работает достаточно быстро, т.к. количество доменов не влико.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру