Вопрос, что быстрее работает... 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, а это не много не мало ... практически в полтора раза.
Комментариев нет:
Отправить комментарий