Здравствуйте! Такой темы вроде бы и не было, а тема обширная.
У меня есть проблема:
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).
Т.е. я понимаю нужно перед циклов сделать подсчёт для каждого раздела сколько же в нём тем.
Этим мы экономим множество запросов к базе. Посоветовал мне такое сделать один хороший кодер, если он захочет, сам о себе скажет.
Думаю не стоит вопрос в топ тему отправлять.
Что такое rid? tid? Совсем мало места было, что на названиях переменных сэкономили?
Названия переменных должны быть ясными - взглянул и понял, о чём она. rid... Rest In Deep.
Количество здесь нужно вынести в отдельное поле таблицы, чтобы не считать его каждый раз, да ещё и в цикле.
А если кому-то хочется до цикла создать какой-нибудь гипервитееватый запрос с подзапросами и джойнами - забудьте про это. Перед циклом он собрался "подсчёт" делать.
В цикле sleep(10); и всё, нагрузка сразу упадет ну а по факту, JOIN в помощь при подсчете, ну и не забываем про индексы (ато подсчет может вырости до минуты ) ну и SQL_CACHE обязательно
07 Фев 2011, 11:11OZ_, а можно узнать такую неприязнь к объединения таблиц в запросе? *pardon*
07 Фев 2011, 11:14rid - razdel ID - уникальный ид разделов форума.
tid - topic ID - уникальный ид тем форума.
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
?
OZ_, Так мне посоветовал "один" человек. Но у меня была идея вот как у тебя: при создании темы в разделе добавлять +1 к полю с количеством тем в разделе, ну а при удалении минусовать. Этот вариант прост мне кажется, но нет ли у него минусов?
07 Фев 2011, 11:30Неуч, у него есть один огромный плюс - не нужны никакие джойны и дополнительные подсчеты, тем более в цикле. это будет работать быстрее.
минус - ну разве что нужно аккуратно увеличивать/уменьшать значение поля, нигде не ошибиться. в случае с подсчетом с пом. COUNT(*) mysql считает за тебя, а здесь ты сам хранишь это значение.
и да, полностью согласен с OZ_. когда у вас будут большие таблицы по несколько миллионов записей и хоть небольшие, но нагрузки - вы переосмыслите это)
Хотя он советовал, наверное, для моего случая, что с такой структурой мне лучше так поступить.
07 Фев 2011, 11:38Не забываем кеш, а так же параметр гроуп может принимать условия по сортировке, то бишь гроуп т1.ид деск
07 Фев 2011, 11:38