Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MyGad 2.0] problem z nieoptymalnym zapytaniem.
kaszanka
post 6.11.2007, 22:21:59
Post #1





Grupa: Zarejestrowani
Postów: 138
Pomógł: 1
Dołączył: 17.02.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
devnul
post 7.11.2007, 00:53:20
Post #2





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


przypuszczam że count(d.id) jest za to odpowiedzialne (funkcja zlicza każdorazowo wszystkie rekordy bazy), ale mogę się mylić


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
smialy
post 8.11.2007, 10:53:04
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 4
Dołączył: 23.05.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


Witam

Zgadzam się z 'devnul', że to COUNT() psuje
Dodaj index do pola `mygad_descs.cat_id` i powinno być dobrze :]

Ten post edytował smialy 8.11.2007, 10:53:29


--------------------
openSuse, Eclipse i Aptana - daje rade
Go to the top of the page
+Quote Post
kaszanka
post 9.11.2007, 22:46:48
Post #4





Grupa: Zarejestrowani
Postów: 138
Pomógł: 1
Dołączył: 17.02.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
smialy
post 17.11.2007, 23:08:57
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 4
Dołączył: 23.05.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


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 :]


--------------------
openSuse, Eclipse i Aptana - daje rade
Go to the top of the page
+Quote Post
SirZooro
post 26.11.2007, 22:38:55
Post #6





Grupa: Zarejestrowani
Postów: 243
Pomógł: 32
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
gostek_
post 16.12.2007, 03:36:42
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 21.03.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
devnul
post 16.12.2007, 12:31:10
Post #8





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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ęć

Ten post edytował devnul 16.12.2007, 12:31:58


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
gostek_
post 16.12.2007, 16:14:26
Post #9





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 21.03.2006

Ostrzeżenie: (0%)
-----


Dzieki serdeczne. Faktycznie różnica w wczytywaniu strony jest kolosalna.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.06.2025 - 22:30