Вопрос по нагрузке на mysql и оптимизации.

123
D5
На сайте с 01.06.2004
Offline
51
#11

А у вас и есть JOIN (INNER), просто формат записи у него такой.

Наберите EXPLAIN SELECT ... и дальше весь код и можно в личку, помогу чем смогу.

Программирование сайтов (http://lindir.ru)
adrin02
На сайте с 12.04.2006
Offline
85
#12

Здравствуйте ещё раз!

Что лучше 10 запросов в цикле и меньшее время генерации страницы

Или 1 запрос и большее время генерации

Скрипт1


$rs = mysql_query("SELECT * FROM categories ORDER BY id",$db);
$rowt = mysql_fetch_array($rs);


do {

$rs2 = mysql_query("SELECT COUNT(*) FROM news WHERE cat='{$rowt["id"]}' OR cat2='{$rowt["id"]}' OR cat3='{$rowt["id"]}'");
$count_vsegonews = mysql_fetch_array($rs2);


printf ("
&nbsp;&nbsp;&nbsp;<A href='category_%s_%s.html'>%s [ %s ]</A> <BR>

", $rowt["id"] , $rowt["translit"], $rowt["title"] , $count_vsegonews[0] );
}
while ($rowt = mysql_fetch_array ($rs));

Скрипт2


$rs = mysql_query("
SELECT cat.id, cat.title, cat.translit,
(SELECT COUNT(*) FROM news WHERE cat=cat.id OR cat2=cat.id OR cat3=cat.id) AS news_count
FROM categories AS cat ORDER BY cat.id
",$db);
$row = mysql_fetch_array($rs);


do {

printf ("
&nbsp;&nbsp;&nbsp;<A href='category_%s_%s.html'>%s [ %s ]</A> <BR>

", $row["id"] , $row["translit"], $row["title"] , $row["news_count"] );
}
while ($row = mysql_fetch_array ($rs));

В итоге второй скрипт занимает больше времени но 1 запрос. Что лучше использовать в таком случае?

Хостинг изображений (http://likepic.net) SpeedTest (http://speed-tester.info)
N
На сайте с 06.05.2007
Offline
419
#13

adrin02, кому лучше ? грузинам?

Кнопка вызова админа ()
[Удален]
#14

оба подхода гавно, в общем то как и сказал нетвайнд.

adrin02
На сайте с 12.04.2006
Offline
85
#15
bearman:
оба подхода гавно, в общем то как и сказал нетвайнд.

Ну тогда скажите какой подход будет лучше ☝

N
На сайте с 06.05.2007
Offline
419
#16

нет. ну откуда нам знать чему ему следует отдать предпочтение при выборе из противоположных целей ?

в одной конфигурации, например с выделенным mysql-сервером может оказаться, что задержки сети влияют значительно на общее время обработки запроса. А в другой с совмещенным php и mysql простые мелкие запросы обрабатываются лучше одного сложного.

Я так думаю, тут просто нечисто время замерено. Вот там выше он пишет, что УЖЕ поднялась посещаемость. Значит ее колебания могут повлиять на результаты замеров. На VPS так что угодно может повлиять.

Не может быть, чтобы один запрос по смыслу заменяющий 10 других был медленнее.

В общем и целом, нужно сделать полное нагрузочное тестирование приложения, максимально похожее на реальную одновременную работу многих пользователей с сайтом, чтобы уверенно рассуждать о пользе тех или иных действий.

[Удален]
#17

в каждом случае все индивидуально.

если запрос не сильно сложный в котором не очень много данных, то лучше все сделать в одном запросе.

имхо

adrin02
На сайте с 12.04.2006
Offline
85
#18

Погонял различные скрипты. Если count(*) то лучше в цикле., Так как в одном запросе почему то долго думает. Пробовал различные результаты и всегда время затрачивается большое.

А вообще count лучше использовать как можно реже. =)

[Удален]
#19

есть альтернатива?

ну собственно его и используют редко :)

а. результаты можно кешировать, не так часто они нужны.

б. то что вы считаете можно просто внести в соотвествующее поле в БД.

например, кол-во сообщений пользователя, раньше вы делали через count но можно в базе данных пользователя сделать доп поле user_comment_qty в котором инкриментировать данные при добавлении собщения.

Да, возможно, надо будет больше кода и размер бд, но это уменьшит нагрузку на сервер.

D5
На сайте с 01.06.2004
Offline
51
#20

adrin02, как я понимаю Вам нужно посчитать кол-во новостей в каждой из категорий. При этом новость может быть в одной, двух или сразу трех категориях?

Запрос

SELECT COUNT(*) FROM news WHERE cat=cat.id OR cat2=cat.id OR cat3=cat.id

скорее всего будет типа ALL независимо от индексов, т.е скан всех записей в таблице. При росте кол-ва записей в news все будет хуже и хуже работать.

Могу посоветовать только 2 варианта оптимизации:

1. вынести категории новостей в отдельную таблицу, что-то типа

create table news_category (

category_id int(11) unsigned not null,

news_id int(11) unsigned not null,

key (category_id, news_id)

) Engine=..

При добавлении новости вписывать 1-3 строчки в эту таблицу. При удалении удалять. При изменении категории обновлять.

Тогда посчитать кол-во новостей в каждой категории можно примерно так:

select c.id, count(*) from categories c inner join news_category nc on nc.category_id = c.id group by c.id;

Запрос будет использовать индексы по categories.id и индекс из news_category, это всяко быстрее чем полный скан таблицы.

2. В categories добавить новое поле типа news_counter и изменять его при добавлении/удалении новости, как в топике уже советовали.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий