Skocz do zawartości

Left Join liczy się 20 minut ;)


Kyo

Rekomendowane odpowiedzi

Mam problem - mam dwie tabele, jedna 8000 rekordów, druga 28.000. RObie LEFT JOIN tej 28k w tą 8k, liczy się ponad 20 minut. Po ograniczneiu pierwszej do 40 rekordów liczy sie i tak 7sekund. To normalne czy mam szukać błędu?

Odnośnik do komentarza
Udostępnij na innych stronach

No utknąłem :)

Jedna tabela zawiera listę katalogów - druga dane wpisów - ip wpisującego, datę, id frazy, id site.

Chce wyświetlić listę katalogów dla danego słowa i pole czy wpis został dodany - teraz robie to tak że wyswietlająć katalog sprawdzam kolejnym zapytaniem czy jest taki wpis na to słowo. Zamiast jednego zpaytania wyswietlam 100 (przy wyswietlaniu 100 katalogow na raz). Przykład:

tabela a

id /nazwa

1 katalog.stron.fajny.pl

2 katalog.stron.niefajny.pl

3 glupikatalog.pl

...

..

tabela b

id wpis/id_kat/id_slowo

1 1 34

2 2 34

3 3 34

4 1 35

5 3 35

Co oznacza ze słowo o id 34 wpisałem do wszytskoch 3 ,a słowo o id 35 do 1 i 3.

Teraz chce wyświeltić liste katalogów i przy każdym napisać czy został dodany.

Odnośnik do komentarza
Udostępnij na innych stronach

Źle napisane zapytanie lub brak indeksów. Ja mam np. 3 left joiny w tabelach gdzie liczba wierszy: 80000, 60000, 1000 wykonuje się 0.1-0.2 sek, np dla 70000 wyników.Total super niewydajny jest jak się zapomni indeksów bo tutaj się nie da zoptymalizować zapytania tak, jak przy inner join. Tzn. SQL musi przemielić każdy wiersz "pierwszej" tabeli, w inner join bierze się tabelę, która ma mniej wierszy i to już samo w sobie niezła optymalizacja jak nic innego się nie da zrobić :blink: Poza tym sql ma większą swobodę w doborze indeksów (w left join indeksem może być tylko foregin key, czyli indeks musi znajdować się w "drugiej" tabeli, w inner join to gdzie jest indeks nie ma znaczenia).

Odnośnik do komentarza
Udostępnij na innych stronach

Zapytanie: SELECT *, COUNT(wpisy.id) FROM katalogi_new LEFT JOIN wpisy ON katalogi_new.nr=wpisy.id_kat GROUP BY katalogi_new.nr

Wynik taki jaki być powienien - cyzli jedna tabela połaczona z drugą lub NULLe jak brakowało, a na końcu podliczona powtarzalność.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli jesteś pewien że masz indeks na wpisy.id_kat to spróbuj zmienić GROUP BY katalogi_new.nr na GROUP BY wpisy.id_kat

albo coś ~

CREATE TEMPORARY TABLE _t SELECT *, wpisy_id as `__id` FROM katalogi_new LEFT JOIN wpisy ON katalogi_new.nr=wpisy.id_kat

SELECT *, count(`__id`) FROM _t GROUP BY `__id`

ew. dodaj indeks typu hash na __id w tymczasowej tabeli

Po wyrzuceniu group by, jeśli z indeksami, serwerem jest ok powinno się wykonywać <1s

Odnośnik do komentarza
Udostępnij na innych stronach

Zapytanie: SELECT *, COUNT(wpisy.id) FROM katalogi_new LEFT JOIN wpisy ON katalogi_new.nr=wpisy.id_kat GROUP BY katalogi_new.nr

Wynik taki jaki być powienien - cyzli jedna tabela połaczona z drugą lub NULLe jak brakowało, a na końcu podliczona powtarzalność.

Zainteresuj się poleceniem EXPLAIN i dajesz

EXPLAIN SELECT *, COUNT(wpisy.id) FROM katalogi_new LEFT JOIN wpisy ON katalogi_new.nr=wpisy.id_kat GROUP BY katalogi_new.nr

i dotajesz listę w jaki sposób baza przerabia zapytanie, czy są indeksy tam gdzie mają być. W praktyce mi przy podobnych zapytaniach (jedna tabelka ok 60.000 rek druga ok. 17.000) zapytanie liczyło się od 4 min, po wsadzeniu odpowiednich indesków spadło do 10-20 sek.

Aplikacje internetowe, systemy wspomagające SEO, programy pod Windows i Linux, info na https://shad.net.pl - dopisz się do Katalogu Firm

Odnośnik do komentarza
Udostępnij na innych stronach

SELECT *, COUNT(wpisy.id) FROM katalogi_new LEFT JOIN wpisy ON katalogi_new.nr=wpisy.id_kat GROUP BY katalogi_new.nr

Co robi ta gwiadka przed count?

Wszędzie uczą, że jak się używa funkcjio agregującej to jeśli w seleccie jest coś co nie ejst funkcją agregującą to musi też występować w group by. A u Ciebie jakoś tak nie jest.

Najwyższej jakości strony internetowe można zamówić w firmie Invini.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności