Ускоряем базу OpenCart
Так как периодически приходится работать с CMS OpenCart, то решил поделиться небольшим лайф-хаком, который конечно уже много раз был описан на профильных форумах, но все-таки по непонятным причинам до сих пор так и не был включен в CMS по умолчанию. Зато почти всегда присутствует во всяких модулях, отвечающих за ускорение работы OpenCart.
Проблема в общем-то заключается в банальном отсутствии индексов в таблицах БД OpenCart, что очень сильно сказывается на быстродействии. При этом если вы просто ручками добавляете товары в небольшой магазин, то какой-то разницы вы особенно не заметите. А вот если у вас основная часть товаров импортируется и обновляется автоматически с использованием какого-нибудь YML-файла, то вот тут могут быть серьезные просадки в скорости обновления имеющихся товаров и создании новых.
Теперь к делу. Вот основной список индексов, которые нужно добавить:
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 секунд. Разница как видите колоссальная!
Так что никогда не забывайте про индексы!
У меня маловато опыта с SQL, но я попробовал применить данный запрос и получил ошибки.
Потом почитал немного об индексах и увидел вот такую конструкцию
ALTER TABLE “table_name” ADD INDEX “index_name” (column_name);
Т.е немного не совпадает с Вашим примером.
Что в данном случае “index_name” ?
index_name — просто название индекса. Например вы можете его дать таким: column_name_index (т.е. просто название столбца и окончание «_index»).
В примере, который приведен в посте, указаны только названия столбцов, соответственно названия индексов будут полностью с ними совпадать.