Вчера я кратко упоминал о том, что сходу наткнулся на 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 раза
Мама… роди меня обратно.
Комментариев нет:
Отправить комментарий