8 июл. 2011 г.

Just benchmark. Легкий SQL запрос VS запрос SQL с использованием JOIN

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

Комментариев нет:

Отправить комментарий