Вопрос, что быстрее работает... sql с кучей join'ов или более простые запросы но с дополнительной обработкой сценария на сервере ...
Нужно достать последнюю модификацию файла (таблица ФАЙЛ), находящихся в разных категория (таблица КАТЕГОРИИ), причем категории включают в себя подкатегории, благо второго порядка. Данные связывающие сия безобразия находятся в таблице ЛИНКС.
Решение:
$cnt=50;
mysql_query("SET SESSION query_cache_type = OFF");
$time_start = getmicrotime();
for ($i=0; $i<=$cnt; $i++) {
$o = "";
$r1 = mysql_query("select c.cat_id from photo_cat_new c where c.parent_id=0");
while($r1_ = mysql_fetch_assoc($r1)) {
$r2 = mysql_query("select group_concat(c.cat_id)pcid from photo_cat_new c where c.parent_id=$r1_[cat_id]");
$r2_ = mysql_fetch_assoc($r2);
$r3 = mysql_query("select group_concat(l.file_id)pfid from photo_links l where l.cat_id in ($r2_[pcid])");
$r3_ = mysql_fetch_assoc($r3);
$r4 = mysql_query("select max(added)last_update from photo_files f where f.file_id in ($r3_[pfid])");
$r4_ = mysql_fetch_assoc($r4);
$o .= "$r1_[cat_id] - $r4_[last_update]
";
}
}
print (getmicrotime() - $time_start);
print "<-->";
mysql_query("SET SESSION query_cache_type = OFF");
$time_start = getmicrotime();
for ($i=0; $i<=$cnt; $i++) {
$o = "";
$sql = "select c.cat_id,max(added)last_update
from photo_cat_new c
left join photo_cat_new c1 on c1.parent_id=c.cat_id
left join photo_links l on l.cat_id=c1.cat_id
left join photo_files f on f.file_id = l.file_id
where c.parent_id=0 group by c.cat_id";
$r = mysql_query($sql);
while($row = mysql_fetch_assoc($r))
$o .= "$row[cat_id] - $row[last_update]
";
}
print (getmicrotime() - $time_start);
function getmicrotime() {list($usec, $sec) = explode(" ", microtime());return ((float)$usec + (float)$sec);}
Результат: join всё же предпочтителен: 11.08 против 16.82, а это не много не мало ... практически в полтора раза.
Комментариев нет:
Отправить комментарий