Есть вопрос по работе с крупными таксономиями более 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( 7 );
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
Как-то можно оптимизировать этот код с учетом большого кол-ва терминов таксономиии? В каком направлении гуглить? Спасибо!
Комментарии
насколько я понял, термины таксономии имеют поле ссылки на другой термин?
и насколько я понял все эти массивы формируются для дальнейшего вывода списков для проверки устройства на совместимость?
и еще непонятно, каким образом каждая игра отмечается на совместимость/несовместимость с каждым устройством(термином)?
Большое спасибо всем за помощь!
Хулиган, ваш совет оказался самым полезным. Сделали через taxonomy_term_load_multiple и еще в одном блоке с нодами через node_load_multiple.