В предходна статия ви показахме как можете да ускорите зареждането на вашия OpenCart онлайн магазин като спрете изчисляването и показването на броя продукти по категории.
Така вие редуцирате множеството SQL заявки към базата данни. Ако ви е нужно броят на продуктите да се показва, можете да извършите други оптимизации за подобряване скоростта на зареждане.
Днес ще прибавим още една основна техника за оптимизация и ускоряване на OpenCart.
Тази оптимизация засяга базата данни на онлайн магазина и може да се извърши отделно от оптимизацията, описана в предходната статия. Ако ги комбинирате, ще можете да видите много голямо подобрение в скоростта на зареждане.
При зареждането на една страница освен за изчисляване на броя продукти за всяка отделна категория, се изпълняват още много други SQL заявки.
Източник на SQL заявки е опцията за приятелски адреси в OpenCart. Всеки адрес и съответстващия му приятелски адрес, се записват в базата данни. Когато се зарежда страница от онлайн магазина за всеки един адрес на категория, продукт и всичко друго, към базата данни се изпращат по няколко SQL заявки. Виждали сме случаи при онлайн магазини, в които при зареждането само на началната страница с около 30 продукта, се извършват 874 SQL заявки, от които 510 само за приятелските адреси, 185 от темата и останалите 179 за продукти, картинки, опции, настройки и всичко останало.
Когато броят на SQL заявките не може да се намали, може да се приложи оптимизация на намирането на информация в базата данни. С поставянето на индекси в най-често претърсваните таблици SQL заявките ще могат да намират и извличат по-бързо търсената информация.
Най-разпространеният пример за това какво е индекс в базата данни:
В телефонния указател записите (редовете) са подредени по име и фамилия в азбучен ред. За да потърсите в него Иван, можете да отворите страницата, в която са подредени всички имена, започващи с буквата И. Това подреждане представлява нещо като главен индекс или главна подредба на записите в указателя. Така ще спестите много време и усилия и няма да ви се наложи да прегледате всяка една страница. Ако обаче потърсите по град, всички редове с дадения град са разпръснати. Тогава ще се наложи да прегледате всяка една страница, за да извадите всеки човек от този град.
Ако се постави индекс на колоната с град, тогава ще знаете кои точно редове съдържат този град. Този втори индекс е като виртуално пренареждане на информацията в указателя по друг параметър вместо по име. Когато търсите по град, ще можете да използвате азбучно подреден списък с имената на градовете и намирането на информацията ще е много бързо.
Индексите помагат за по-бързото намиране на конкретна информация в таблиците на базата данни. Когато информацията се търси по определена колона в таблицата, на тази колона може да се създаде индекс.
Оптимизацията, описана в тази част, представлява поставяне на индекси в определени таблици на базата данни. Ако ползвате хостинг акаунт с контролен панел cPanel, единствено ще трябва да достъпите инструмента за работа с базите данни – phpMyAdmin.
Направете бекъп на базата данни
Преди да започнете с промените, погрижете се да имате готов бекъп на базата данни, за да можете бързо да възстановите предишното й състояние.
- Ръчно генериране на бекъп и възстановяване
Бекъп на базата данни може да се извърши ръчно през cPanel -> Backups -> Генериране на пълен бекъп (full backup). Възстановяване на базата данни от този бекъп също се извършва ръчно.
Ако базата данни е с по-малък размер, можете бързо да създадете бекъп копие през phpMyAdmin. Mаркирате базата данни, кликвате на Операции и в секция Копиране на БД в: попълвате името на нова база данни (например cpaneluser_newdb).
- Автоматично генериране на бекъп и възстановяване
Бекъп на базата данни се извършва автоматично и ще присъства в системно генерирания бекъп за хостинг акаунта. За възстановяване на базата данни от този системен бекъп препоръчваме да се използва Backup Manager by SuperHosting в cPanel. В мениджъра можете да видите датата и часа на последно генерирания системен бекъп. Ако след датата на генерирания бекъп не са извършвани други промени, освен тези за оптимизацията, тогава можете бързо и лесно да върнете предишното състояние на базата данни, без загуба на информация.
Оптимизация на базата данни
Важно: Поставянето на индекси по определени таблици може да допринесе за ускоряване на зареждането на потребителската част на онлайн магазина, но може да се отрази в забавяне на зареждането в административния панел. Забавяне ще се усети, когато се създава нова категория или се добави нов продукт, тъй като съществуващият индекс в съответната таблица ще се пресъздаде (обнови).
С прилагането на промените таблица по таблица можете да извършвате измерване на скоростта и проверка на коректното зареждане на онлайн магазина.
Описаните редове с код представляват SQL заявки, които можете да копирате, поставите в секция SQL на phpMyAdmin и изпълните. Веднъж поставен, индексът е постоянен и не е необходимо в бъдеще да го поставяте отново. Обърнете внимание и ако е необходимо, променете префикса на таблиците (в посочените примери префиксът е oc_).
Таблиците за категориите
ALTER TABLE `oc_category` ADD INDEX ( `parent_id` ) ; ALTER TABLE `oc_category` ADD INDEX ( `top` ) ; ALTER TABLE `oc_category` ADD INDEX ( `sort_order` ) ; ALTER TABLE `oc_category` ADD INDEX ( `status` ) ; ALTER TABLE `oc_category_description` ADD INDEX ( `language_id` ); ALTER TABLE `oc_category_to_store` ADD INDEX ( `store_id` );
В случай че имате много подкатегории с подкатегории, с подкатегории и т.н., поставете индекс на колоната path_id:
ALTER TABLE `oc_category_path` ADD INDEX ( `path_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_option` ADD INDEX ( `option_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_product_to_category` ADD INDEX ( `category_id` ); ALTER TABLE `oc_product_attribute` ADD INDEX ( `attribute_id` ); ALTER TABLE `oc_product_attribute` ADD INDEX ( `language_id` ); ALTER TABLE `oc_product_description` ADD INDEX ( `language_id` ); ALTER TABLE `oc_product_to_store` ADD INDEX ( `store_id` );
Таблиците за опциите към продуктите
В случай че имате богат избор от опции към продуктите, добавете индекси и в следните таблици:
ALTER TABLE `oc_option` ADD INDEX ( `sort_order` ) ; 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_url_alias` ADD INDEX ( `query` ) ; ALTER TABLE `oc_url_alias` ADD INDEX ( `keyword` ) ; ALTER TABLE `oc_url_alias` ADD INDEX ( `url_alias_id` );
След поставяне на тези индекси, в определени случаи, сме забелязвали значително намаляване на времето за зареждане. Особено ускорение се получава в комбинация с оптимизацията чрез спиране изчисляването и показването на броя продукти по категории.
Съвет от support-а: Към цялостната оптимизация се включват и други промени, които можете да направите, като активиране на mod_deflate и Memcached, ползване на mod_expires и други. Към техниките за оптимизация се включва и ползването на SSD дискове за MySQL базата данни.
Съвет от support-а: Тази инструкция за оптимизация е резултат от честите запитвания от наши клиенти, но с нея не се изчерпват всички решения за нуждите на всеки един онлайн магазин на OpenCart. Когато тези кратки напътствия не са достатъчни, това, което препоръчваме, е да се потърси съдействие от професионалистите в тази област. Те могат да съдействат, извършвайки подробна проверка и прилагайки точна оптимизация за нуждите на конкретния онлайн магазин.