Xwab
Форумыnavigate_nextБазы данных

Оптимизация (работа с MySQL)
Сообщения
JESOD

Здравствуйте! Такой темы вроде бы и не было, а тема обширная.
У меня есть проблема:
if (mysql_num_rows(mysql_query("SELECT `rid` FROM `forum_section` LIMIT 1"))) {
    $sql   =   mysql_query("SELECT `rid`,`name` FROM `forum_section` ORDER BY `poz` ASC LIMIT 10");
   
     while ($row = mysql_fetch_assoc($sql)) {
          $rid =   $row['rid'];
          $name =   out($row['name']);
        $topics = mysql_result(mysql_query("SELECT COUNT(`tid`) FROM `forum_topics` WHERE `rid` = '$rid' "), 0);
        echo '<a href="/forum/'.$rid.'/">'.$name.'</a> ['.$topics.']<br/>';
    }

} else {
    echo 'Разделов нет!';
}
Здесь нужно как-нибудь избавиться от запроса mysql_query() к базе в цикле(запрос в переменной $topics).
Т.е. я понимаю нужно перед циклов сделать подсчёт для каждого раздела сколько же в нём тем.
Этим мы экономим множество запросов к базе. Посоветовал мне такое сделать один хороший кодер, если он захочет, сам о себе скажет.
Думаю не стоит вопрос в топ тему отправлять.


__________
посл.ред. 07 Фев 2011, 21:28; всего 1 раз 07 Фев 2011, 11:02
OZ_

Что такое rid? tid? Совсем мало места было, что на названиях переменных сэкономили?
Названия переменных должны быть ясными - взглянул и понял, о чём она. rid... Rest In Deep.

Количество здесь нужно вынести в отдельное поле таблицы, чтобы не считать его каждый раз, да ещё и в цикле.

А если кому-то хочется до цикла создать какой-нибудь гипервитееватый запрос с подзапросами и джойнами - забудьте про это. Перед циклом он собрался "подсчёт" делать.

07 Фев 2011, 11:10
suhonok

В цикле sleep(10); и всё, нагрузка сразу упадет  ну а по факту, JOIN в помощь при подсчете, ну и не забываем про индексы (ато подсчет может вырости до минуты  ) ну и SQL_CACHE обязательно

07 Фев 2011, 11:11
suhonok

OZ_, а можно узнать такую неприязнь к объединения таблиц в запросе? *pardon*

07 Фев 2011, 11:14
JESOD

rid - razdel ID - уникальный ид разделов форума.
tid - topic ID - уникальный ид тем форума.

07 Фев 2011, 11:26
JESOD

suhonok, как-то так:
SELECT `t1`.`pole`,
      COUNT(`t2`.`id`) AS `count`
      FROM `table1` AS `t1`
      LEFT JOIN `table2` AS `t2`
      ON (`t1`.`id`=`t2`.`id_razdel`)
      GROUP BY `t1`.`id`
      ORDER BY `t1`.`id` DESC
?

07 Фев 2011, 11:28
JESOD

OZ_, Так мне посоветовал "один" человек. Но у меня была идея вот как у тебя: при создании темы в разделе добавлять +1 к полю с количеством тем в разделе, ну а при удалении минусовать. Этот вариант прост мне кажется, но нет ли у него минусов?

07 Фев 2011, 11:30
luethus

Неуч, у него есть один огромный плюс - не нужны никакие джойны и дополнительные подсчеты, тем более в цикле. это будет работать быстрее.
минус - ну разве что нужно аккуратно увеличивать/уменьшать значение поля, нигде не ошибиться. в случае с подсчетом с пом. COUNT(*) mysql считает за тебя, а здесь ты сам хранишь это значение.
и да, полностью согласен с OZ_. когда у вас будут большие таблицы по несколько миллионов записей и хоть небольшие, но нагрузки - вы переосмыслите это)

07 Фев 2011, 11:37
JESOD

Хотя он советовал, наверное, для моего случая, что с такой структурой мне лучше так поступить.

07 Фев 2011, 11:38
suhonok

Не забываем кеш, а так же параметр гроуп может принимать условия по сортировке, то бишь гроуп т1.ид деск

07 Фев 2011, 11:38
Ответить на тему