Ускоряем базу OpenCart

Так как периодически приходится работать с CMS OpenCart, то решил поделиться небольшим лайф-хаком, который конечно уже много раз был описан на профильных форумах, но все-таки по непонятным причинам до сих пор так и не был включен в CMS по умолчанию. Зато почти всегда присутствует во всяких модулях, отвечающих за ускорение работы OpenCart.
Проблема в общем-то заключается в банальном отсутствии индексов в таблицах БД OpenCart, что очень сильно сказывается на быстродействии. При этом если вы просто ручками добавляете товары в небольшой магазин, то какой-то разницы вы особенно не заметите. А вот если у вас основная часть товаров импортируется и обновляется автоматически с использованием какого-нибудь YML-файла, то вот тут могут быть серьезные просадки в скорости обновления имеющихся товаров и создании новых.
Теперь к делу. Вот основной список индексов, которые нужно добавить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ALTER TABLE `sx_option_description` ADD INDEX ( `name` ) ; ALTER TABLE `sx_option_value` ADD INDEX ( `option_id` ) ; ALTER TABLE `sx_option_value_description` ADD INDEX ( `option_id` ) ; ALTER TABLE `sx_order` ADD INDEX ( `customer_id` ) ; ALTER TABLE `sx_product` ADD INDEX ( `model` ) ; ALTER TABLE `sx_product` ADD INDEX ( `sku` ) ; ALTER TABLE `sx_product` ADD INDEX ( `upc` ) ; ALTER TABLE `sx_product` ADD INDEX ( `manufacturer_id` ) ; ALTER TABLE `sx_product` ADD INDEX ( `sort_order` ) ; ALTER TABLE `sx_product` ADD INDEX ( `status` ) ; ALTER TABLE `sx_product` ADD INDEX ( `date_available` ) ; ALTER TABLE `sx_product_option` ADD INDEX ( `option_id` ) ; ALTER TABLE `sx_product_option` ADD INDEX ( `product_id` ) ; ALTER TABLE `sx_product_option_value` ADD INDEX ( `product_option_id` ) ; ALTER TABLE `sx_product_option_value` ADD INDEX ( `product_id` ) ; ALTER TABLE `sx_product_option_value` ADD INDEX ( `option_id` ) ; ALTER TABLE `sx_product_option_value` ADD INDEX ( `option_value_id` ) ; ALTER TABLE `sx_user` ADD INDEX ( `username` ) ; ALTER TABLE `sx_user` ADD INDEX ( `password` ) ; ALTER TABLE `sx_user` ADD INDEX ( `email` ) ; ALTER TABLE `sx_attribute` ADD INDEX ( `attribute_group_id` ) ; |
Этот список актуален для OpenCart 3 и может быть немного неполным для предыдущих версий.
Теперь про профит. Простое тестирование показывает, что если скрипт до добавления индексов выполнялся в течении 7-10 минут, то после добавления время работы сократилось до 40-50 секунд. Разница как видите колоссальная!
Так что никогда не забывайте про индексы!