Mam to "szczęście", że muszę po poprzednikach poprawić zapytania w sklepie internetowym. W znacznym stopniu baza danych zostaje obciążona czego efektem jest wydłużony czas ładowania się strony.
Zapytania wyświetlające listę produktów w sklepie:
SELECT z.zdj, z.id_zest, z.symbol, zj.nazwa, zj.*,MAX(p.data_add) AS data_produkt, zc.wartosc,zc.id_cech FROM (zestawy z, zestawy_jezyki zj, produkty p, kategorie_zestawy kz, kategorie k ) LEFT JOIN produkty_jezyki pj ON p.id_prod=pj.id_prod AND pj.id_lang=1 LEFT JOIN zestawy_cechy zc ON zc.id_zest=z.id_zest AND zc.id_cech=2 WHERE p.id_zest=z.id_zest AND p.stan=1 AND z.id_zest=zj.id_zest AND z.stan=1 AND zj.id_lang=1 AND kz.id_kat=k.id_kat AND z.id_zest=kz.id_zest AND p.detal=1 AND (kz.id_kat=3009 OR k.id_gr=3009) GROUP BY z.id_zest ORDER BY data_produkt DESC , zj.nazwa ASC LIMIT 0, 20
SELECT count(DISTINCT z.id_zest) AS il FROM (zestawy z, zestawy_jezyki zj, produkty p, kategorie_zestawy kz, kategorie k ) LEFT JOIN produkty_jezyki pj ON p.id_prod=pj.id_prod AND pj.id_lang=1 LEFT JOIN zestawy_cechy zc ON zc.id_zest=z.id_zest AND zc.id_cech=2 WHERE p.id_zest=z.id_zest AND p.stan=1 AND z.id_zest=zj.id_zest AND z.stan=1 AND zj.id_lang=1 AND kz.id_kat=k.id_kat AND z.id_zest=kz.id_zest AND p.detal=1 AND (kz.id_kat=3009 OR k.id_gr=3009)
zapytanie zostaje wywołane dwa razy:
1 dla listy produktów, 2 (jak wywnioskowałem) dla paginacji (ilość stron produktów).
Indexy założone na tabele (nazwa tabeli - pola indexow):
zestawy - id_zest(pk), id_kat, zdj, symbol;
zestawy_jezyki - id_zest_l(pk), id_zest, id_lang, nazwa, opis, ivona(nie uzywane juz w sklepie pole w bazie), ivona_url(jak w przypadku ivony)
zestawy_cechy - id_cech_l(pk) & id_zest, id_cech_l(pk), id_zest, wartosc
produkty - id_prod(pk), id_user, id_vat, id_produc, id_zest, id_rodz, data_add, idx_stan, detal
produkty_jezyki - id_prod_l(pk), id_prod, id_lang
kategorie_zestawy - id_kat_zest(pk), id_kat & id_zest
kategorie - id_kat(pk), id_user, id_gr
Wszystkie tabele to MyISAM.
Jakie są wasze sugestie co do optymalizacji tego zapytania ?