Автор Тема: MySQL и LEFT JOIN  (Прочитано 3460 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL и LEFT JOIN
« : 19 Мая 2005, 12:39:06 »
Есть 2 таблицы, таблица новостей и рейтинга к ним.
table news (id name text)
table reyt (id idn reyt)

Делаю
SELECT name, text, SUM(reyt.reyt) as reyt, COUNT(reyt.id) AS kol FROM news LEFT JOIN reyt ON reyt.idn=news.id GROUP by news.id ORDER BY news.id DESC

Но запрос выполняется достаточно медленно. Точнее он выполняется медленнее, чем если бы я сначала вытащил информацию о новости и только потом на ее основе рейтинг. Может я что-то не то делаю?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
MySQL и LEFT JOIN
« Ответ #1 : 19 Мая 2005, 13:02:27 »
Tryapkonator
индексы на каких полях привинчены?
And no religion too...

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL и LEFT JOIN
« Ответ #2 : 19 Мая 2005, 13:12:03 »
Индексы в news на id только и в reyt на id и idn соответственно. На id везде примари, на idn в таблице reyt просто индекс

Оффлайн sarutobi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 61
  • +0/-0
  • 0
    • Просмотр профиля
MySQL и LEFT JOIN
« Ответ #3 : 20 Мая 2005, 14:51:23 »
Интересный запрос.... агрегатные функции вперемешку с простым выбором... Странно что он вообще хоть что то возвращает :)
Почему-то у меня выпадает что name и text не были использованы ни в аггрегировании, ни в группировке. Или это сейчас можно делать? :))

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL и LEFT JOIN
« Ответ #4 : 20 Мая 2005, 17:44:10 »
А тогда как делать? Просто новостная таблица содержит 6000 полей, а при данном запросе, в запросе используется 130000 полей... ужас.

Оффлайн sarutobi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 61
  • +0/-0
  • 0
    • Просмотр профиля
MySQL и LEFT JOIN
« Ответ #5 : 20 Мая 2005, 21:45:15 »
Я имел в виду то, что запрос нужно было написать так:
SELECT name, text, SUM(reyt.reyt) as reyt, COUNT(reyt.id) AS kol FROM news LEFT JOIN reyt ON reyt.idn=news.id
GROUP by name, text
ORDER BY news.id DESC
и не более того.
А насчет скорости - в случае выборки одной новости тебе и рейтинг только одной посчитать надо, это быстро. твой же запрос просчитывает рейтинг 6000 новостей, обсчитывая  130000 записей.
Варианты ускорения:
1. Если есть возможность рулить сервером MySQL - поиграйся с переменными key_buffer и table_cache. Только учти что приэтом возрастут требования к доступной серверу памяти.
2. Подели таблицу рейтинга на две. В одну сбрось состояние рейтинга в виде (номер_новости, число голосов, сумма оценок), а вторую оставь как есть. Первую таблицу обновляй примерно раз в сутки на основе второй, вторую при этом очищай.
Если есть вопросы мыль на sarutobi at pisem.net

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL и LEFT JOIN
« Ответ #6 : 20 Мая 2005, 23:59:01 »
Ошибся немного в запросе, заранее известен идентификатор новости, т.е. запрос
SELECT name, text, SUM(reyt.reyt) as reyt, COUNT(reyt.id) AS kol FROM news LEFT JOIN reyt ON reyt.idn=news.id WHERE news.id=\'$id\' GROUP by news.id
В данном случае ведь без разницы что в GROUP by, но все равно по раздельности запросы выполняются намного быстрее... Сервер не мой. Второй способ немного не понял. Ведь мне нужно каким-то образом осуществлять выборку из БД по индентификатору.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28