Скорость выполнения запроса (HELP)

Mitosan

Новичок
Скорость выполнения запроса (HELP)

Здравствуйте уважаемые !

В общем дело в следуюшем:


есть определенный массив скажем с номерами объявлений в количестве 9 штук

PHP:
    $recs = array(111,222,333,444,555,666,777,888,999);
необходимо сделать выборку из трех таблиц:

table 1 - основная таблица с данными объявлений
table 2 - таблица со списком категорий
table 3 - таблица со справочниками

делаю это так

PHP:
foreach($recs as $record)
{
  // сам запрос
  $query = "SELECT t1.*, t2.name2, t3.title AS curr FROM table1 t1, table2 t2, table3 t3 WHERE t1.id='{$record}' AND t2.id=t1.pid AND t3.id=t1.unit";

  $result = mysql_query($query);
  $item = mysql_fetch_row($result);

  echo $item['name'].'<br/>' 
}
Результат: Все работает так как надо
Проблема в том, что запрос существенно увеличивает время исполнения скрипта.
При выводе 9 результатов время выполнения скрипта составляет - 6.467 сек и скрипт реально начинает тупить

Если закомментировать эти две строчки:
PHP:
   $result = mysql_query($query);
  $item = mysql_fetch_row($result);
то время исполнения скрипта составляет 0.9 сек

скорость считал с помощью memory_get_usage

EXPLAIN запроса выводит

PHP:
'SIMPLE', 't1', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, ''
'SIMPLE', 't2', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, ''
'SIMPLE', 't3', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, 'Using index'
Плиз, помогите разобраться. Мож я что нибудь не так понимаю?

ЗЫ. (вдруг пригодится)
Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4
MySQL5
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Mitosan
Скажи, пожалуйста, а ты не думал о том, чтоб достать данные _все_сразу_,
а не лезть за каждой записью в бд циклом, как делаешь ты, по отдельности?

-~{}~ 18.09.08 14:44:

___скорость___ считал с помощью memory_get_usage
:confused:
 

Gas

может по одной?
Mr_Max
+1

Mitosan
план запроса хороший, проблема может быть в скорости сети (если db-сервер и php на разных машинах) или db-сервер очень нагружен IO-операциями. Можешь попытаться выявить причину так:

SET profiling = 1;
твой запрос;
SHOW PROFILE;

и смотреть на каком этапе тупит, если Sending data - значит сеть.
 

Mitosan

Новичок
Господа ! Спасибо всем. Разобрался %)
причина была в самом запросе, кототый крутится в цикле
PHP:
$query = "SELECT t1.*, t2.name2, t3.title AS curr FROM table1 AS t1, table2 AS t2, table3 AS t3 WHERE t1.id='{$record->id}' AND t2.id=t1.parent_id AND t3.id=t1.unit";
именно AS в условии ...FROM table1 AS t1, table2 AS t2... производил такой эффект тормозов. Хотя я и не понял почему.
В данный момент этот кусок выглядит так:

PHP:
$sql = "SELECT t1.*, t2.name2,t2.id AS bid,t3.title AS curr FROM table1  t1, table2 t2, table3 t3 WHERE "
        ."t1.status='published' AND t1.parent_id<>'0' AND t1.image_list<>'' AND t1.image_list IS NOT NULL "
        ." AND t2.id=t1.parent_id AND t3.id=t1.unit GROUP BY t1.parent_id  ORDER BY t1.date DESC LIMIT 0,9";
$recs = mysql_query($sql);  

while($record = mysql_fetch_object($recs) )  
{  
  echo $record->name.'<br />';
}
 

assous

Новичок
hm, a kuda propal t1.id='{$record}' ?

gde $record, elemen massiva $recs
$recs = array(111,222,333,444,555,666,777,888,999);

sdelai join massiva $recs i zameni t1.id= na t1.id IN ($join_recs)
 
Сверху