[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Есть ли способ оптимизировать такой запрос вVmySQ?
Abibas
У меня такая проблема, не могу сам сообразить.Мой вопрос касаеться оптимизации, в каторой я мало что знаю), я где то прочитал что лучше не использовать запросы в БД в циклах for, while, итд=) И я вспомнил что я как раз допустил эту ошибку, из за которой как бэ сильно нагружаю серв=)) Вот мой код запроса-->>>
<?php
$id=$_SESSION['id'];// извлекаю ид текущего пользователя
// следующий код извлекает списки врагов пользователя=)
$vrag_info=mysql_query("SELECT * FROM vrags WHERE vs1='$id' or vs2='$id'",$bd);
// сначала извлкаю данные из таблицы VRAGS, в которой три ячейки, это id, потом ид одного пользователя,и в последней ячейке ид другова пользователя, эта строка показываеть, что пользователя с данными ид враги по отношению друг к другу=))
while ($myvrag = mysql_fetch_array($vrag_info)){
//создаю цикл в котром извлекаю ид пользователей
$vs1=$myvrag['vs1'];// ид одного пользователя
$vs2=$myvrag['vs2'];// ид другова пользователя
//следующий запрос извлекает всех пользователей, с ид $vs1 или $vs2, и не равные ид текущего пользователя из таблицы USERS
$vrag=mysql_query("SELECT * FROM users WHERE (id != '$id') and (id = '$vs1' or id = '$vs2')",$bd);
// здесь извлекаю
$vragP = mysql_fetch_array($vrag);
$name='$vragP[login'];
$hp=$vragP['hp'];
$xp=$vragP['xp'];
$max_hp=$vragP['max_hp'];
$id_vrag=$vragP['id'];
// далее я вывожу параметры каждого пользователя между тэгами(Я вывожу данные в XML, получаемые AJAX функцией)
}// закрываю цикл WHILE
?>
так вооот, вопрос следующий, есть способы оптимизации данного запроса к базе, ну что бы не надо было в цикле делать запрос к друго таблице???Может быть есть способ в одном запросе извлечь инфу их базы USERS используя ид пользователей из базы VRAGS ???



Спустя 4 минуты, 9 секунд (20.02.2011 - 13:58) sharki написал(а):
О_О :DDDD ты сам всё это разукрашивал???
PS над полем где ты вводил этот код есть bb теги, и там PHP, который разукрасил бы твой код автоматически =))

Сорри не удержался)

Спустя 3 минуты, 3 секунды (20.02.2011 - 14:01) Abibas написал(а):
Хаааахааа, вот я лошарез, сидел, мучался, и вставлял теги с цветами, спасиб что сказал, а то бы я сам не обратил внимание на всякие там кнопки=)) В следующий раз буду знать, на этом форуме тока седня зарегался))

Спустя 20 минут, 55 секунд (20.02.2011 - 14:22) T1grOK написал(а):
На счет циклов это бред, не слышал такого. Можно конечно выполнить первый запрос, выбрать всех врагов и выполнить второй запрос с конструкцией IN, но такая конструкция будет выполняться дольше.

<?php
$id=$_SESSION['id'];// извлекаю ид текущего пользователя
// следующий код извлекает списки врагов пользователя=)

$vrag_info=mysql_query("SELECT * FROM vrags WHERE vs1='$id' or vs2='$id'",$bd);
// сначала извлкаю данные из таблицы VRAGS, в которой три ячейки, это id, потом ид одного пользователя,и в последней ячейке ид другова пользователя, эта строка показываеть, что пользователя с данными ид враги по отношению друг к другу=))
while ($myvrag = mysql_fetch_array($vrag_info)){
//создаю цикл в котром извлекаю ид пользователей
if ($myvrag['vs1'] != $id) $vrag = $myvrag['vs1'];
if ($myvrag['vs2'] != $id) $vrag = $myvrag['vs2'];
//следующий запрос извлекает всех пользователей, с ид $vs1 или $vs2, и не равные ид текущего пользователя из таблицы USERS
$vrag=mysql_query("SELECT * FROM users WHERE id = '$vrag'",$bd);
// здесь извлекаю
$vragP = mysql_fetch_array($vrag);
$name='$vragP[login'];
$hp=$vragP['hp'];
$xp=$vragP['xp'];
$max_hp=$vragP['max_hp'];
$id_vrag=$vragP['id'];
// далее я вывожу параметры каждого пользователя между тэгами(Я вывожу данные в XML, получаемые AJAX функцией)
}// закрываю цикл WHILE
?>


Спустя 1 час, 19 минут, 38 секунд (20.02.2011 - 15:41) Abibas написал(а):
Если выполняться будет дольше то тогда оставлю как есть)))Про то что в циклах лучше не вставлять обращения к базе прочитал в статье по оптимизации PHP кода за 2001 год=) А как можно замерить скорость формирования страницы??? Я видел сайты, на которых внизу страницы показан таймер, в котором было написано "Страница создана за 0.013 сек"=)) программированием занимаюсь полтора месяца где то, так что опыта не так много, хочу с помощью такова таймера замерять скорость работы скриптов на PHP=))

Спустя 29 минут, 30 секунд (20.02.2011 - 16:11) sergeiss написал(а):
Цитата (Abibas @ 20.02.2011 - 14:54)
так вооот, вопрос следующий, есть способы оптимизации данного запроса к базе, ну что бы не надо было в цикле делать запрос к друго таблице???Может быть есть способ в одном запросе извлечь инфу их базы USERS используя ид пользователей из базы VRAGS ???

Есть способы smile.gif
Вот тут в соседней теме как раз обсуждается: http://phpforum.ru/index.php?showtopic=40787&hl=

Спустя 18 часов, 10 минут, 30 секунд (21.02.2011 - 10:21) linker написал(а):
Вот это
$vrag_info=mysql_query("SELECT * FROM vrags WHERE vs1='$id' or vs2='$id'",$bd); 
противоречит этому
$vrag=mysql_query("SELECT * FROM users WHERE (id != '$id') and (id = '$vs1' or id = '$vs2')",$bd)
ибо
vs1='$id' or vs2='$id'
, т.е. $vs1 = $id или $vs2 = $id, таким образом id != '$id' ложно ибо
id = '$vs1' or id = '$vs2'
,т.е. id = vs1 = $id или id = vs2 = $id
Думаем, формулируем заново задачу.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.