Forum Webscript.Ru

Общие => Базы данных => Тема начата: Tryapkonator от 19 Мая 2005, 12:39:06

Название: MySQL и LEFT JOIN
Отправлено: Tryapkonator от 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

Но запрос выполняется достаточно медленно. Точнее он выполняется медленнее, чем если бы я сначала вытащил информацию о новости и только потом на ее основе рейтинг. Может я что-то не то делаю?
Название: MySQL и LEFT JOIN
Отправлено: commander от 19 Мая 2005, 13:02:27
Tryapkonator
индексы на каких полях привинчены?
Название: MySQL и LEFT JOIN
Отправлено: Tryapkonator от 19 Мая 2005, 13:12:03
Индексы в news на id только и в reyt на id и idn соответственно. На id везде примари, на idn в таблице reyt просто индекс
Название: MySQL и LEFT JOIN
Отправлено: sarutobi от 20 Мая 2005, 14:51:23
Интересный запрос.... агрегатные функции вперемешку с простым выбором... Странно что он вообще хоть что то возвращает :)
Почему-то у меня выпадает что name и text не были использованы ни в аггрегировании, ни в группировке. Или это сейчас можно делать? :))
Название: MySQL и LEFT JOIN
Отправлено: Tryapkonator от 20 Мая 2005, 17:44:10
А тогда как делать? Просто новостная таблица содержит 6000 полей, а при данном запросе, в запросе используется 130000 полей... ужас.
Название: MySQL и LEFT JOIN
Отправлено: sarutobi от 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
Название: MySQL и LEFT JOIN
Отправлено: Tryapkonator от 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, но все равно по раздельности запросы выполняются намного быстрее... Сервер не мой. Второй способ немного не понял. Ведь мне нужно каким-то образом осуществлять выборку из БД по индентификатору.