Так как периодически приходится работать с CMS OpenCart, то решил поделиться небольшим лайф-хаком, который конечно уже много раз был описан на профильных форумах, но все-таки по непонятным причинам до сих пор так и не был включен в CMS по умолчанию. Зато почти всегда присутствует во всяких модулях, отвечающих за ускорение работы OpenCart.
Проблема в общем-то заключается в банальном отсутствии индексов в таблицах БД OpenCart, что очень сильно сказывается на быстродействии. При этом если вы просто ручками добавляете товары в небольшой магазин, то какой-то разницы вы особенно не заметите. А вот если у вас основная часть товаров импортируется и обновляется автоматически с использованием какого-нибудь YML-файла, то вот тут могут быть серьезные просадки в скорости обновления имеющихся товаров и создании новых.
Теперь к делу. Вот основной список индексов, которые нужно добавить:
ALTER TABLE `oc_option_description` ADD INDEX ( `name` ) ;
ALTER TABLE oc_option_value` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_option_value_description` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_order` ADD INDEX ( `customer_id` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `model` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `sku` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `upc` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `manufacturer_id` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `sort_order` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `status` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `date_available` ) ;
ALTER TABLE `oc_product_option` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_product_option` ADD INDEX ( `product_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `product_option_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `product_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `option_value_id` ) ;
ALTER TABLE `oc_user` ADD INDEX ( `username` ) ;
ALTER TABLE `oc_user` ADD INDEX ( `password` ) ;
ALTER TABLE `oc_user` ADD INDEX ( `email` ) ;
ALTER TABLE `oc_attribute` ADD INDEX ( `attribute_group_id` ) ;
Этот список актуален для OpenCart 3 и может быть немного неполным для предыдущих версий.
Теперь про профит. Простое тестирование показывает, что если скрипт до добавления индексов выполнялся в течении 7-10 минут, то после добавления время работы сократилось до 40-50 секунд. Разница как видите колоссальная!