Каждый кто делал магазин на Opencart c количеством товаров более 20000 штук, сталкивается с одной и той же проблемой — к сожалению из коробки данная система не может нормально работать с таким количеством товаров. Вот о том, как ускорить работу Opencart при работе с таким количеством товаров и пойдет речь.
В первую очередь необходимо проинспектировать наш файл конфигурации mysql (в данном пункте речь пойдет только о выделенном сервере, так как если вы располагаетесь на хостинге то хостер сделал все за вас). Для Centos он находится в /etc/my.cnf. Данный файл желательно заменить в зависимости от настроек вашего сервера. В папке /usr/share/mysql располагаются 4 оптимизированных файла настроек mysql под разные сервера — my-small.cnf, my-medium.cnf, my-large.cnf и my-huge.cnf. Выбираем под наш сервер, нашу память, наши запросы наиболее подходящий файл. my-small.cnf — конфигурация для систем с обьемом памяти менее 64Mb, где mysql используется время от времени. Это не наш случай. medium.cnf — чуть лучше, под mysql может выделяться до 64Мb памяти. В общем то это тоже обычно не для нас, разве что очень маломощные VDS, VPS. my-large.cnf — уже посерьезнее, для систем с оперативной памятью от 512Мb. my-huge.cnf — для систем с оперативной памятью 1-2Gb. Выбираем одну из наиболее подходящих нам конфигураций и переписываем ее вместо текущей my.cnf .
В консоли набираем:
cp /usr/share/mysql/my-large.cnf /etc/my.cnfи перезапускаем mysql
service mysqld restart
Далее перейдем к админке Opencart. При работе Opencart нужно отключить подсчет товаров в категориях в верхнем меню
делается это в пункте админ панели Система — Настройки — Изменить — Опции — выставляем значение Нет.
Далее нам нужно добавить недостающие индексы в базу данных. Дело в том, что по умолчанию в базе данных Opencart при установке они не создаются. Необходимо зайти в PhpMyAdmin и выполнить SQL запрос следующего вида
ALTER TABLE oc_product_attribute ADD INDEX attribute_id ( attribute_id ); ALTER TABLE oc_product_attribute ADD INDEX language_id ( language_id ); ALTER TABLE oc_product_description ADD INDEX language_id ( language_id ); ALTER TABLE oc_product_image ADD INDEX product_id ( product_id ); ALTER TABLE oc_product_image ADD INDEX sort_order ( sort_order ); ALTER TABLE oc_product_option ADD INDEX product_id (product_id); ALTER TABLE oc_product_option ADD INDEX option_id (option_id); ALTER TABLE oc_product_option_value ADD INDEX product_option_id (product_option_id); ALTER TABLE oc_product_option_value ADD INDEX product_id (product_id); ALTER TABLE oc_product_option_value ADD INDEX option_id (option_id); ALTER TABLE oc_product_option_value ADD INDEX option_value_id (option_value_id); ALTER TABLE oc_product_option_value ADD INDEX subtract (subtract); ALTER TABLE oc_product_option_value ADD INDEX quantity (quantity); ALTER TABLE oc_product_reward ADD INDEX product_id ( product_id ); ALTER TABLE oc_product_reward ADD INDEX customer_group_id ( customer_group_id ); ALTER TABLE oc_product_to_category ADD INDEX category_id ( category_id ); ALTER TABLE oc_product_to_store ADD INDEX store_id ( store_id ); ALTER TABLE oc_setting ADD INDEX store_id ( store_id ); ALTER TABLE oc_setting ADD INDEX `group` ( `group` ); ALTER TABLE oc_setting ADD INDEX `key` ( `key` ); ALTER TABLE oc_setting ADD INDEX serialized ( serialized ); ALTER TABLE oc_url_alias ADD INDEX query ( query );
где «oc_» префикс базы данных, указывайте свой при добавлении. Если при выполнении возникают ошибки вероятно данные индексы у вас уже присутствуют.
Далее необходимо оптимизировать таблицу СЕО урл следующим запросом
ALTER TABLE `oc_url_alias` CHANGE `query` `query` VARCHAR( 32 ) NOT NULL; ALTER TABLE `oc_url_alias` ADD INDEX `query` ( `query` );
Ну и в конце данных мероприятий я обычно устанавливаю модуль superdruid который также работает с индексами таблиц. Данные действия довольно сильно влияют на быстродействие работы с базой данных. Конечно можно далее работать по оптимизации запросов, кешированию страниц, но сие относится уже совсем к другой истории)