![]() |
![]() |
![]()
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ę ![]() |
|
|
![]() |
![]()
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ć
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 4 Dołączył: 23.05.2007 Skąd: Łódź Ostrzeżenie: (10%) ![]() ![]() |
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
|
|
|
![]()
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? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 4 Dołączył: 23.05.2007 Skąd: Łódź Ostrzeżenie: (10%) ![]() ![]() |
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
|
|
|
![]()
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
![]() ![]() -------------------- |
|
|
![]()
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. |
|
|
![]()
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
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 -------------------- |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 27.06.2025 - 22:30 |