Перейти к содержимому


Функции из mysql.php


  • Вы не можете ответить в тему
В этой теме нет ответов

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 12 October 2013 - 07:06 PM

Глянул я совершенно по случайности в эти функции и взяло меня сомнение, не являются ли они достаточно узким местом, оптимизация которого приведет к заметному повышению производительности на системах с большим количеством товаров/категорий?
Функция db_fetch_row выглядит как

function db_fetch_row($q) //row fetching
{
$res = mysql_fetch_row($q["resource"]);
if ( $res )
{
foreach( $q["columns"] as $column_name => $column_index )
$res[$column_name] = $res[$column_index];
}
return $res;
}

, хотя делает то же самое, что и

function db_fetch_row($q) //row fetching
{
return mysql_fetch_array($q["resource"]);
}

Причем дело не в старинности ShopCMS, т.к. mysql_fetch_array() есть аж с PHP3.

Если результат запроса содержит несколько сотен строк, то на слабом сервере, как мне кажется, разница будет заметна.

Соответственно, становится не нужным и создание подмассива ["columns"] (больше он нигде не используется) в функции db_query, оно ведь тоже отнимает время при объемном результате запроса.

$res["columns"]=array();
$column_index = 0;
while($xwer = @mysql_fetch_field($res["resource"])){
$res["columns"][$xwer->name] = $column_index;
$column_index++;
}


По хорошему, все $res["resource"] и $res['resource'] надо заменить на просто $res, $q["resource"] на $q, а $Result["resource"] на $Result, т.к. обращение к элементу массива всегда дольше, чем к простой переменной. Но это уже, наверное, копейки.

Никто не пробовал такие замены в качестве оптимизации скорости работы? Я заменил, все работает, но на моих двустах тестовых товарах разницу не заметишь даже в цифрах, т.к. она будет невелика на фоне других случайно влияющих факторов.

PS. Это я еще до рекурсивной функции создания массива категорий не добрался. Там же вообще трындец при большом количестве категорий. Уверенно предполагаю, что вместо рекурсивного обхода "по одному запросу на категорию" (а может и больше) то же самое можно решить одним общим запросом, а результат затем обработать уже на PHP, что будет (возможно) быстрее. Или вообще оба массива категорий в кэше каком-либо хранить, пересоздавая только по созданию/удалению/перемещению категории в админке.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)