Кеширование sql запросов

Добрый день!

Пиши каталог для одного сайта. На настоящий момент, чтобы вывести рубрикатор выполняется 255 sql-запросов. Подскажите пожалуйста как можно эти запросы закешировать? Сейчас мне выдаются вот такие результаты

MySql
query: 255
time: 0,606
Cache
query: 0
— set: 0
— get: 0
time: 0

Записи извлекаю вот так
$sql = "SELECT *, LOWER(category_title) as category_title_lower
        FROM {$this->dbprefix}category
        WHERE category_parent_id = '{$iCatID}'
        ORDER BY category_title";
$aRows = $this->oDb->select($sql);

12 комментариев

avatar
Похоже я плохо искал в начале) Кеширование LS
avatar
На настоящий момент, чтобы вывести рубрикатор выполняется 255 sql-запросов.
это не нормально в принципе, что с кешированием, что без
  • ort
  • +1
avatar
я использую рекурсию при выводе.
public function GetCategoryTree($iCatID){
    $aCatsTree = array();
    $sql = "SELECT *, LOWER(category_title) as category_title_lower
            FROM {$this->dbprefix}category
            WHERE category_parent_id = '{$iCatID}'
            ORDER BY category_title";
    $aRows = $this->oDb->select($sql);
    foreach ($aRows as $oRow) {
    	$oRow['category_subcats'] = $this->GetCategoryTree($oRow['category_id']);
      $aCatsTree[] = $oRow;
    }
    return $aCatsTree;
  }


Что посоветуете?
avatar
я использую рекурсию при выводе
рекурсия всегда зло, а при запросах к БД еще страшнее
Что посоветуете?
посмотреть варианты реализации древовидных комментариев в LS — обработка на PHP всего дерева и nested set
avatar
Посмотрите, одна из лучших реализаций без рекурсии с использованием переменных-ссылок всего за один цикл.
avatar
Спасибо
avatar
как его потом вывести?
avatar
Собственно вставка:

 {include file="block.categories.tpl" aCategories=$aCategories}

файл block.categories.tpl:

{if $aCategories}
<ul>
 {foreach $aCategories as oCategory}
  {if $oCategory->getEnabled()}
        <li>
	 {if $oCategoryCurrent and $oCategory->getId()==$oCategoryCurrent->getId()}
	    <strong>{$oCategoryCurrent->getName()}</strong>
	 {else}
	  <a href="{router page='category'}{$oCategory->getUrl()}" title="{$oCategory->getName()}">{$oCategory->getName()}</a>
	 {/if}
	  {include file="block.categories.tpl" aCategories=$oCategory->getSubCategories()}
	 </li>
  {/if}
 {/foreach}	
 </ul>
 {/if}
avatar
пардон, там
{foreach $aCategories as $oCategory}
avatar
в этом и был вопрос — вывод идет через рекурсию, но уже в шаблоне
avatar
Насколько я знаю, чтобы выводить без рекурсии, надо заведомо знать уровень вложеннности и связи узлов.
avatar
верно, на этой логике и работает текущий код в LS
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.