Помощь Оптимизация запроса к БД в коде модуля

  • Автор темы Автор темы killoff
  • Дата начала Дата начала

killoff

Команда форума
Moderator
Разрушитель (V)
Сообщения
182
Реакции
92
Баллы
1 418
Есть старый модуль, который ещё мне скидывали на нулледе, но с ним у меня сейчас возникла проблема. При подключении модуля на сайте с 42к новостями:
Код:
<!-- The script execution time 8,64123 seconds -->
<!-- The time compilation of templates 3,48908 seconds -->
<!-- Time executing MySQL query: 5,2086 seconds -->
<!-- The total number of MySQL queries 12 -->
<!-- RAM uses 260,55 MB -->
<!-- For compression was used gzip -->
<!-- The total size of the page: 58792 bytes After compression: 11898 bytes -->
Без него:
Код:
<!-- The script execution time 0,11997 seconds -->
<!-- The time compilation of templates 0,06262 seconds -->
<!-- Time executing MySQL query: 0,00223 seconds -->
<!-- The total number of MySQL queries 2 -->
<!-- RAM uses 3,33 MB -->
<!-- For compression was used gzip -->
<!-- The total size of the page: 54915 bytes After compression: 11350 bytes -->
Сам код:
Код:
<?php
include ('engine/api/api.class.php'); // подключаем api
$table = 'dle_post';  // название таблицы
$fields  = 'xfields'; // нужные поля, * - все поля
$where = 'approve=1'; // условия выборки
$multirow = 1; // забирать ли один ряд или несколько
$start = 0; // начальное значение выборки
$limit = 0; // количество записей для выборки, 0 - выбрать все
$xfield = 'xfxfxf'; ///ИМЯ ДОП ПОЛЯ ДЛЯ ВЫВОДА
$time = '140000'; //время жизни кеша

$xfields = $dle_api->load_from_cache ($fields, $time, $xfields); //берем наш кеш, если есть конечно ))
if( !$xfields ) { //проверяем взяли ли мы кеш и если не взяли, то делаем запрос
    $xfields = $dle_api->load_table ($table,$fields,$where,$multirow,$start,$limit); //делаем запрос к бд
    $dle_api->save_to_cache ( xfields, $xfields); //сохраняем в кеш
    }

$stack = array(); //создаем пустой массив
foreach($xfields as $value){  // перебор значений массива
    if($value[xfields]){ //проверяем есть ли элемент в массиве
  
        $row = xfieldsdataload($value[xfields]); //получаем нужное нам доп поле
        if($row[$xfield]){ //проверяем есть ли значение
          
            $rowdata = explode( ",", $row[$xfield]); //разбиваем наше значение на массив
            foreach($rowdata as $value){    //перебираем значения массива
                if($value){                    //проверяем есть ли значение
                    $value = trim($value);    //убираем пробелы
                    array_push($stack, $value); //добавляем в конец массива полученное значение
                    }
                }
            }
        }
    }
$stack = array_count_values($stack); //считаем повторы и избавляемся от повторных значений

foreach($stack as $key => $count){  //выводим окончательный вариант
$key_img = str_replace('\"', '', $key);
echo "
<div class=\"category_block\">
    <a href=\"/xfsearch/".rawurlencode($key)."/\">
    <div class=\"category_img\">
        <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\" alt=\"Подборка: {$key}\" />
        <div class=\"category_title\">
            &laquo;{$key_img}&raquo;
        </div>
        <div class=\"category_count\">
            $count
        </div>
    </div>
    </a>
</div>
";

    }
?>
Собственно вопрос к кодерам: как можно оптимизировать данный код, чтобы он не хавал там много оперативки и работал быстро. Новостей на сайте 42к, размер БД - чуть более 300Мб.
 
1. Не использовать DLE Api.
2. Не использовать для этого таблицу новостей _post а _xfsearch
3. Переписать в итоге весь код.
 
Назад
Верх