Перенагрузка на БД от крупной таксономии (более 1000 терминов)

Главные вкладки

Аватар пользователя brianmc brianmc 10 июля 2014 в 18:25

Есть вопрос по работе с крупными таксономиями более 1000-2000 терминов.
Во время разработки сайта исполнителем был сделан следующий код:

<?php
function fusion_core_preprocess_node(&$vars) {
 [...]
    
// Compatibility --- SELECT cid, data, created, expire, serialized FROM {cache_field} WHERE cid IN ('field:taxonomy_term:INT')
    
$Compatibility $devicesType $brandList = array();
    
$devices taxonomy_get_tree);
    
    foreach ( 
$devices as $item ) {
      if ( 
in_array(0$item->parents) ) continue;
      
$TDevice taxonomy_term_load($item->tid);
      if ( 
androapps_interface_check_compatibility$vars['node'], $TDevice ) ) {
        
$Compatibility[] = $item;
        if (!
in_array($TDevice->field_devices_type['und'][0]['tid'], $devicesType)) $devicesType[] = $TDevice->field_devices_type['und'][0]['tid'];
        if (!
in_array($item->parents[0], $brandList)) $brandList[$item->parents[0]][] = $item;
      }
    }
 [...]
}
?>

Со временем по мере наполнения сайта при вызове $TDevice = taxonomy_term_load($item->tid); происходит сильная перегрузка базы данных, соответственно, сайт загружается крайне медленно. При выводе в лог всех запросов к БД, которые возникают при вызове $TDevice выдается что-то около 2000-3000 терминов. Если же код вырезать совсем (тогда функция совместимости не будет работать, естественно), то все грузится очень быстро.

Ссылка на рабочий проект: http://mobtable.com/grand-theft-auto-san-andreas.html

Как-то можно оптимизировать этот код с учетом большого кол-ва терминов таксономиии? В каком направлении гуглить? Спасибо!

Комментарии

Аватар пользователя drupby drupby 10 ноября 2015 в 11:49

насколько я понял, термины таксономии имеют поле ссылки на другой термин?

и насколько я понял все эти массивы формируются для дальнейшего вывода списков для проверки устройства на совместимость?

Аватар пользователя drupby drupby 10 июля 2014 в 22:48

и еще непонятно, каким образом каждая игра отмечается на совместимость/несовместимость с каждым устройством(термином)?

Аватар пользователя brianmc brianmc 19 июля 2014 в 20:53

Большое спасибо всем за помощь!
Хулиган, ваш совет оказался самым полезным. Сделали через taxonomy_term_load_multiple и еще в одном блоке с нодами через node_load_multiple.