Problem z długim czasem reakcji strony na odświeżenie.
Naszym wcześniejszym rozwiązaniem było podłączenie cache'owania Redis dla naszej strony tehnoexpert.com.ua i sprawdzenie, czy to pomoże w szybkim ładowaniu stron, kategorii i podkategorii. Jeśli ta czynność nie pomoże, konieczne będzie zainstalowanie na stronie odpowiedniego modułu do cache'owania, jego konfiguracja i sprawdzenie, czy to rozwiąże problem. Alternatywnie, można dostosować rdzeń strony lub motywy, aby szybciej reagowały na odświeżenie poprzez linki, produkty.
Przykład modułów do cache'owania, https://opencartadmin.com/jet-cache
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=37650&filter_search=cache
Lub ich odpowiedniki
Opis problemu od wsparcia hostingowego:
Od razu widać, że podczas przeglądania produktów na stronie wykonywane są nieoptymalne zapytania do bazy danych, których wyniki zajmują dużo czasu, przez co strona ładuje się długo. Przykład takich zapytań:
use tehnoexpert_main;
SET timestamp=1752305970;
SELECT m.manufacturer_id AS value_id, m.image, m.name AS name FROM oc_manufacturer m LEFT JOIN oc_manufacturer_to_store m2s ON (m.manufacturer_id = m2s.manufacturer_id) LEFT JOIN oc_product p ON (m.manufacturer_id = p.manufacturer_id) WHERE m2s.store_id = '0' GROUP BY m.manufacturer_id ORDER BY m.sort_order ASC, name ASC;
# Time: 250712 10:40:37
# User@Host: tehnoexpert_main[tehnoexpert_main] @ localhost []
# Thread_id: 67 Schema: tehnoexpert_main QC_hit: No
# Query_time: 16.217911 Lock_time: 0.000049 Rows_sent: 2203 Rows_examined: 8812
# Rows_affected: 0 Bytes_sent: 40604
SET timestamp=1752306037;
SELECT m.manufacturer_id AS value_id, m.image, m.name AS name FROM oc_manufacturer m LEFT JOIN oc_manufacturer_to_store m2s ON (m.manufacturer_id = m2s.manufacturer_id) LEFT JOIN oc_product p ON (m.manufacturer_id = p.manufacturer_id) WHERE m2s.store_id = '0' GROUP BY m.manufacturer_id ORDER BY m.sort_order ASC, name ASC;
# Time: 250712 10:41:08
# User@Host: tehnoexpert_main[tehnoexpert_main] @ localhost []
# Thread_id: 77 Schema: tehnoexpert_main QC_hit: No
# Query_time: 15.807077 Lock_time: 0.000070 Rows_sent: 2203 Rows_examined: 8812
# Rows_affected: 0 Bytes_sent: 40604
SET timestamp=1752306068;
SELECT m.manufacturer_id AS value_id, m.image, m.name AS name FROM oc_manufacturer m LEFT JOIN oc_manufacturer_to_store m2s ON (m.manufacturer_id = m2s.manufacturer_id) LEFT JOIN oc_product p ON (m.manufacturer_id = p.manufacturer_id) WHERE m2s.store_id = '0' GROUP BY m.manufacturer_id ORDER BY m.sort_order ASC, name ASC;
# Time: 250712 10:42:30
# User@Host: tehnoexpert_main[tehnoexpert_main] @ localhost []
# Thread_id: 109 Schema: tehnoexpert_main QC_hit: No
# Query_time: 14.659375 Lock_time: 0.000044 Rows_sent: 2203 Rows_examined: 8812
# Rows_affected: 0 Bytes_sent: 40604
SET timestamp=1752306150;
SELECT m.manufacturer_id AS value_id, m.image, m.name AS name FROM oc_manufacturer m LEFT JOIN oc_manufacturer_to_store m2s ON (m.manufacturer_id = m2s.manufacturer_id) LEFT JOIN oc_product p ON (m.manufacturer_id = p.manufacturer_id) WHERE m2s.store_id = '0' GROUP BY m.manufacturer_id ORDER BY m.sort_order ASC, name ASC;
# Time: 250712 10:43:12
# User@Host: tehnoexpert_main[tehnoexpert_main] @ localhost []
# Thread_id: 120 Schema: tehnoexpert_main QC_hit: No
# Query_time: 14.884237 Lock_time: 0.000151 Rows_sent: 2203 Rows_examined: 8812
# Rows_affected: 0 Bytes_sent: 40604
Widać, że ten sam wolny zapytanie SQL jest wykonywane co kilka sekund, co obciąża mariadb. Problem powtarzających się zapytań do bazy danych to połączenie złego cache'owania + ponownego ładowania tych samych danych przy każdym zapytaniu.
Oznacza to, że powtarzające się zapytanie SQL do tabel oc_manufacturer, oc_manufacturer_to_store, oc_product jest wykonywane przy każdym ładowaniu strony i pobiera wszystkich producentów powiązanych ze sklepem, wraz z ich nazwami i obrazami, sortując je według kolejności/alfabetycznie.
Rozwiązaniem Twojego problemu może być optymalizacja takich zapytań do bazy danych poprzez zmianę struktury zapytania SQL, co wymaga bardziej szczegółowego zapoznania się z tabelami bazy danych.
Lub można podłączyć cache'owanie Redis dla Twojej strony na Opencart, aby powtarzające się dane były przechowywane w pamięci RAM i nie były za każdym razem wysyłane do mariadb.