В статистике хостера увидел, что мой сайт сильно превышает все лимиты на sql-запросы. Оказалось, что вывод одной странички обходится в шесть-семь секунд из-за определённых запросов. Я по-быстрому разобрался с memcached и запилил оптимизацию, но это на данный момент лишь костыль. SQL я пока очень плохо знаю, потому прошу подсказать, что я в запросе неправильно написал: Код (Text): SELECT `id`, `title`, `desc`, `swf`, (SELECT SUM(`rating`) FROM `ratings` WHERE `gameid`=`games`.`id`) / (SELECT COUNT(*) FROM `ratings` WHERE `gameid`=`games`.`id`) AS `rat`, (SELECT COUNT(*) FROM `gameplays` WHERE `gameid`=`games`.`id`) AS `plays` FROM `games` WHERE (`categoryid` LIKE '%1%') ORDER BY `rat` DESC, `plays` DESC LIMIT 0, 26; Таблица ratings содержит список оценок, поставленных играм разными пользователями. Таблица gameplays - список айпишников и прочих данных о игравших пользователях. Ну а games - информацию о самих играх. Что я делаю (для некоторого categoryid): получаю id игры, чтобы знать, куда перенаправить пользователя получаю title и desc (название и описание игры) считаю rat (рейтинг) игры, деля сумму всех выставленных ей оценок на количество выставленных ей оценок считаю plays (сколько уникальных человек сыграло)
на вскидку. -проверить если индексы на поля по которым идет выборка и вычисления -добавить отдельные поля РЕЙТИНГ и УНИКАЛЬНЫЕ_ИГРОКИ в таблицу ИГРЫ. вычислять и обновлять эти поля в фоне или в момент реального изменения(голосования). тогда не придется их вычислять при запросе, а просто брать готовые значения
вложенные селекты это смерть. попробуй какнить иначе, вместо считалки при каждой выборке, считай и записывай в поле при обновлении/добавлении.
Спасибо за советы, но мне на данный момент уже удалось добиться удовлетворительных результатов (запрос ускорился минимум в 50 раз), просто перенеся оператор LIMIT. Было: Код (Text): SELECT `id`, `title`, `desc`, `swf`, (SELECT SUM(`rating`) FROM `ratings` WHERE `gameid`=`games`.`id`) / (SELECT COUNT(`id`) FROM `ratings` WHERE `gameid`=`games`.`id`) AS `rat`, (SELECT COUNT(`id`) FROM `gameplays` WHERE `gameid`=`games`.`id`) AS `plays` FROM `games` WHERE (`categoryid` LIKE '%1%') ORDER BY `rat` DESC, `plays` DESC LIMIT 0, 26; Стало: Код (Text): SELECT `id`, `title`, `desc`, `swf`, (SELECT SUM(`rating`) FROM `ratings` WHERE `gameid`=`games`.`id`) / (SELECT COUNT(`id`) FROM `ratings` WHERE `gameid`=`games`.`id`) AS `rat`, (SELECT COUNT(`id`) FROM `gameplays` WHERE `gameid`=`games`.`id`) AS `plays` FROM (SELECT * FROM `games` LIMIT 0, 26) AS `games` WHERE (`categoryid` LIKE '%1%') ORDER BY `rat` DESC, `plays` DESC;
Только вот логика запроса изменилась. И результат тоже будет другой. Сейчас, случайно, могло и совпасть.