Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie ze złączeniem 2 tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
yaaa
Witam,

Mam problem z którym nie mogę sobie poradzić. Oto on:
Są 2 tabele do jednej loguję ile razy został otwarty artykuł czyli za każdym razem jak ktoś otworzy dany artykuł do tabeli jest dodawany kolejny rekord z jego id. W drugiej tabeli mam dane artykulu id, tytul ...
Problem:
  1. SELECT log.art_id, count(*) AS ile
  2.  
  3. FROM log_cache_summary AS log
  4. GROUP BY art_id
  5. ORDER BY ile DESC

Wykonanie zapytania na jednej tabeli z logami (ok 500 tys wpisów) trawa ok 1 sekundy, ale po zlaczeniu zapytania gdzie chcę dołączyć tytuł z drugiej tabeli wymięka nawet phpAdmin!!! Oto zapytanie:
  1. SELECT log.art_id, art.title, count(*) AS ile
  2.  
  3. FROM log_cache_summary AS log
  4. LEFT JOIN wyn_article AS art ON (log.art_id=art.id)
  5. GROUP BY art_id
  6. ORDER BY ile DESC

kombinowałem z INNER JOIN ale nie pomogło. Co zauważyłem jeszcze, że gdy z powyższego zapytania usunę art.title czyli będzie wyglądało tak:
  1. SELECT log.art_id, count(*) AS ile
  2.  
  3. FROM log_cache_summary AS log
  4. LEFT JOIN wyn_article AS art ON (log.art_id=art.id)
  5. GROUP BY art_id
  6. ORDER BY ile DESC

zapytanie przynajmniej się wykona choć czas jest ok 15 sekund

Ma ktoś jakąś koncepcje questionmark.gifquestionmark.gif
SongoQ
Cytat
Ma ktoś jakąś koncepcje questionmark.gifquestionmark.gif

Indeksy:
- na zlaczenia (czyli warunki zlaczen)
- na warunki w WHERE
- na sortowanie
- jesli pomoze to tez na grupowanie
yaaa
Cytat(SongoQ @ 2006-01-16 17:39:11)
Indeksy:
- na zlaczenia (czyli warunki zlaczen)
- na warunki w WHERE
- na sortowanie
- jesli pomoze to tez na grupowanie

Guru nie jestem dla tego czy możesz mi powiedzieć mniej wiecej jak zakłada sięindexy na złączenia , sortowanie i grupowanie
SongoQ
Aaaaaaaaaj, nie zrozumiales mnie. Moze inaczej, zakladasz indeks na pole ktore wystepuje w zlaczeniu, sortowaniu lub grupowaniu.
yaaa
Teraz kumam dzieki

Ale niestety nic to nie zmieniło tzn. przy zapytaniu:
  1. SELECT log.art_id, art.title, count(*) AS ile
  2.  
  3. FROM log_cache_summary AS log
  4. INNER JOIN wyn_article AS art ON log.art_id=art.id
  5. GROUP BY art_id
  6. ORDER BY ile DESC

phpAdmin wymięk więc nawet nie wiem ile ono się wykonuje.
Indexy założyłem na pole art_id w tabeli log_cache_summary oraz na title i id w tabeli wyn_article. Chciałbym to wyciągać z bazy jednym zapytaniem ale mam tez koncepcję żeby wykonać dwa pytania jedno:
  1. SELECT log.art_id, count(*) AS ile
  2.  
  3. FROM log_cache_summary AS log
  4. GROUP BY art_id
  5. ORDER BY ile DESC

wynik zapakować do tablicy i drugie
  1. SELECT id, title
  2.  
  3. FROM wyn_article

zapakować do tablicy i potem przechodząc przez pierwszą tablice dopasować po id tytuły z drugiej tablicy. Mało to eleganckie ale skoro pierwsze zapytanie trwa 1 sek. jakis ulamek sek. + dopasowanie mysle ze sie zamknie w 4 sek.
Co wy na to questionmark.gif?
Synaps
Heh, yaa zdecydowanie musisz zmienic koncepcje dzialania ;-) Dodaj do tabeli z artami pole np. 'open_counter' i za każdym razem gdy ktoś otworzy art'a rób update open_counter = open_counter + 1. Obecnie twój sposób jest mało optymalny, chyba że jeszcze zbierasz jakieś dodatkowe statyski ( ip, typ przegladarmi, os ) wtedy ma to jakis sens. Choć wydaje mi sie iż trzymanie ww. stat na poziomie artykuły jest bezsensowne. Lepiej zbierać staty dla całego serwisu i też przez UPDATE'y. Mam nadzieje, że się jasno wyraziłem, bo jestem dziś jakiś taki wczorajszy sleepysmiley03.gif
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.