Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MyGad 2.0] problem z nieoptymalnym zapytaniem.
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy portalowe i CMS'y
kaszanka
Hi,

Dziś rano dostałem maila od mojej firmy hostingowej które piszę, iż posiadam skrypt wykonujący nieoptymalne zapytania

- skypt MyGad 2.0 (opisy gg)
- rekordów/opisów w bazie: 36 563

log przesłane przez firmę:
Cytat
# Time: 071106 20:30:01
# User@Host: kaszanka[kaszanka] @ localhost []
# Query_time: 5 Lock_time: 0 Rows_sent: 19 Rows_examined: 694754
use kaszanka-opisygg;
SELECT c.*,count(d.id) AS count FROM mygad_categories c LEFT JOIN mygad_descs d ON (d.cat_id=c.id AND d.active="1") GROUP BY c.id ORDER BY name ASC;


Ktoś się może orientuje co w tym zapytaniu jest nie tak, że potrzebuje wczytać aż 694 tysiące rekordów skoro w bazie jest tylko 36 tysięcy i wynikowych tylko 19?

Mam 7 dni na optymalizację worriedsmiley.gif
devnul
przypuszczam że count(d.id) jest za to odpowiedzialne (funkcja zlicza każdorazowo wszystkie rekordy bazy), ale mogę się mylić
smialy
Witam

Zgadzam się z 'devnul', że to COUNT() psuje
Dodaj index do pola `mygad_descs.cat_id` i powinno być dobrze :]
kaszanka
Dziękuje bardzo za informacje, pomogło.
Obecnie z 694 tysięcy nadmiarowo wczytanych rekordów jest tylko już 36 tysiące czyli dokładnie tyle ile jest rekordów w bazie.

A może da się to jeszcze bardziej zoptymalizować?

A tak w ogóle to jest możliwe zbudowanie lub poprawić tak zapytania by nadmiarowo wczytanych rekordów było zawsze zero? czyli wczytane wyłącznie te wynikowe?
smialy
Pamiętam że samo dodanie indeksu spowodowało zamiast 4 sekund otrzymanie wyniku w 0.04 sekundy :]

Można by spróbować rozbić zapytania na dwa i sortować po jakimś polu tylu int a nie po name ale to trzebaby potestować. Z MySQL to znam tylko podstawy :]
SirZooro
Po pierwsze pozakładaj na bazę indeksy, bo tam w oryginale ich nie ma. Po drugie zrób sobie cache'owanie danych wyświetlanych na stronie głównej (menu, kategorie ostatnie opisy, najaktywniejsi użytkownicy) - ja trzymam je zserializowane w pliku, co daje znaczną optymalizację (mam zrobione automatycznie tworzenie tego pliku po jego skasowaniu - prosty sposób na wymuszenie odświeżenia po zmianie w panelu admina smile.gif). Poza tym polecam przejrzenie wszystkich skryptów - poza tym że skrypty są podatne na atak SQL Injection (w newsach też XSS), jest tam też masa innych pomniejszych błędów (np. brak jednej polskiej literki w funkcji obcinającej ogonki z polskich znaków smile.gif)
gostek_
Witam. Mógłby ktoś jasno opisac jak dodać indexy? Nigdy tego nie robiłem a chciałbym zoptymalizować nieco Mygad.
Bede wdzięczny za pomoc.
devnul
Ręcznie sql`em
  1. ALTER TABLE `nazwa_tabeli_w_wybranej_bazie` ADD INDEX ( `nazwa_kolumny` )

lub jesli używasz np phpmyadmin`a do zarządzania bazą danych to w widoku struktury danej tabeli znajdziesz sekcję indeksy - wystarczy że skorzystasz z "kreatora" który pomoże Ci wykonać zadaną operację przy pomocy kiklku kliknięć
gostek_
Dzieki serdeczne. Faktycznie różnica w wczytywaniu strony jest kolosalna.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.