To jeszcze napisz odpowiedź na pytanie @mjmartino.
To jeszcze napisz odpowiedź na pytanie @mjmartino.
Webdeveloper do usług ;)
Ponieważ po przełączeniu tabel na InnoDB odrazu widać było, że czas generowania strony wynosi dobre kilkanascie sekund, wiec zajrzalem do logow serwera i mysql zalogowal przykladowo nastepujace zapytanie jako long_query_time:
wiec przelaczylem #__categories spowrotem na myisam i strona ponownie zaczela funkcjonowac jak nalezyKod:SELECT c.id, c.asset_id, c.access, c.alias, c.checked_out, c.checked_out_time, c.created_time, c.created_user_id, c.description, c.extension, c.hits, c.language, c.level, c.lft, c.metadata, c.metadesc, c.metakey, c.modified_time, c.note, c.params, c.parent_id, c.path, c.published, c.rgt, c.title, c.modified_user_id, c.version, CASE WHEN CHAR_LENGTH(c.alias) != 0 THEN CONCAT_WS(':', c.id, c.alias) ELSE c.id END as slug FROM zfgey_categories as c LEFT JOIN (SELECT cat.id as id FROM zfgey_categories AS cat JOIN zfgey_categories AS parent ON cat.lft BETWEEN parent.lft AND parent.rgt WHERE parent.extension = 'com_content' AND parent.published != 1 GROUP BY cat.id) AS badcats ON badcats.id = c.id LEFT JOIN zfgey_categories AS s ON (s.lft <= c.lft AND s.rgt >= c.rgt) OR (s.lft > c.lft AND s.rgt < c.rgt) WHERE (c.extension='com_content' OR c.extension='system') AND c.access IN (1,1,5) AND c.published = 1 AND badcats.id is null AND s.id=8 GROUP BY c.id, c.asset_id, c.access, c.alias, c.checked_out, c.checked_out_time, c.created_time, c.created_user_id, c.description, c.extension, c.hits, c.language, c.level, c.lft, c.metadata, c.metadesc, c.metakey, c.modified_time, c.note, c.params, c.parent_id, c.path, c.published, c.rgt, c.title, c.modified_user_id, c.version ORDER BY c.lft;
Zrób sobie tabelę, w której będziesz agregował dane z obu baz (przez jakieś api), pamiętaj o zoptymalizowaniu jej indeksów.
Webdeveloper do usług ;)
InnoDB z definicji potrzebuje więcej pamięci niż MyISAM, a żeby działało szybciej to trzeba przeprojektować, strukturę tabel i przepływ danych w niej zawartych. Zapytanie, które prezentujesz nie należy do najprostszych i czytelnych. Może warto do niego usiąść i je uprościć.
Powyższe zapytanie SQL jest dość pamięciożerne.
Póki co możesz odnaleźć miejsce gdzie jest generowane to zapytanie i wyrzucić kolumny po GROUP BY c.id.
Dla J3.8.x plik libraries/src/Categories/Categories.php:
Linia 294:
zmień na:Kod PHP:
// Group by
$query->group(
'c.id, c.asset_id, c.access, c.alias, c.checked_out, c.checked_out_time,
c.created_time, c.created_user_id, c.description, c.extension, c.hits, c.language, c.level,
c.lft, c.metadata, c.metadesc, c.metakey, c.modified_time, c.note, c.params, c.parent_id,
c.path, c.published, c.rgt, c.title, c.modified_user_id, c.version'
);
Ten prosty zabieg powinien wystarczyć na początek.Kod PHP:
// Group by
$query->group(
'c.id'
);