The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Не могу сделать SQL запрос быстрее, DISTINCT"
Отправлено CromaX, 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 Гуру, сам не осилю.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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