воскресенье, 30 декабря 2012 г.

OpenCart: Резервы быстродействия

Вчера я кратко упоминал о  том, что сходу наткнулся на 3 запроса к БД которые не вредно бы кэшировать. Сегодня я это сделал, пока начерно, не задумываясь о красоте кода. И естественно возжелал узнать, а много ли от этого проку. Как выяснилось – немного. Результат был меньше статистической погрешности, иными словами каждый запуск теста давал иное значение и разброс этих  значений был больше эффекта от кэширования этих 3ех запросов. Должен отметить, что такой результат меня смутил. Я усомнился, стоит ли городить огород и есть ли польза встроенного в OpenCart механизма кэширования, он, кстати, достаточно скромный. Это файловый кэш и увеличивая объем кэшированных данных мы по сути подменяем механизмы поиска БД, механизмами поиска файловой системы и еще вопрос, какие из них лучше оптимизированы.

Однако, чуть позже я задумал посмотреть, а какие вообще запросы к БД выполняются и какой процент из них кэшируется. Не мудрствуя лукаво добавил пару строк в класс DB

class DB {
    private $driver;
    private $log;
   

public function __construct($driver, $hostname, $username, $password, $database) {
    …       
    $this->log = new Log("dblog");
}

    public function query($sql) {
        $this->log->write($sql);
        return $this->driver->query($sql);
      }

Результат обескураживает. Первый вывод страницы – 99 обращений к БД. Второй и последующие – 91.

Из них 3 исключаются за счет моих усилий (на самом деле 2, я не учел какие-то нюансы с первым магазином, а может что-то на портачил во время возни с мультимагазином ) еще 6 кэшируются движком OpenCart, а остальные 91 (!) выполняются при каждой (!!!) загрузке главной страницы.

Причем например такой запрос:

SELECT * FROM test_extension WHERE `type` = 'module'

Выполняется за время загрузки одной страницы 4 (!) раза. И вот такой:


SELECT * FROM test_layout_route WHERE 'common/home' LIKE CONCAT(route, '%') AND store_id = '0' ORDER BY route ASC LIMIT 1


тоже 4 раза! Вот эти запросы:

SELECT * FROM test_currency
SELECT * FROM test_weight_class wc LEFT JOIN test_weight_class_description wcd ON (wc.weight_class_id = wcd.weight_class_id) WHERE wcd.language_id = '2'
SELECT * FROM test_length_class mc LEFT JOIN test_length_class_description mcd ON (mc.length_class_id = mcd.length_class_id) WHERE mcd.language_id = '2'

Выдают информацию которая изменяется дай бог если несколько раз за все время существования магазина. Выдача этого запроса тоже меняется лишь чуть чаще чем никогда:


SELECT * FROM test_extension WHERE `type` = 'total'


Короче ужос, просто тихий  ужос. Оптимизировать, оптимизировать и еще раз оптимизировать. Перешел на страницу продукта. 161 запрос. Вторая и последующие загрузки -  156. Смотрим:


SELECT * FROM test_currency - 3 раза


Мама… роди меня обратно.

Комментариев нет:

Отправить комментарий