Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] INNER JOIN
Forum PHP.pl > Forum > Przedszkole
ols1994
Mam pytanie jak używam w jednym zapytaniu kilkanaście razy 'inner join' to jakoś obciążam dodatkowo bazę? Czy zapytania takiego typu(patrz dół) są dobre?

  1. SELECT * FROM users
  2. INNER JOIN nazwa AS n1 ON users_id=n1.nazwa_id
  3. INNER JOIN nazwa AS n2 ON users_id=n2.nazwa_id
  4. INNER JOIN nazwa AS n3 ON users_id=n3.nazwa_id
  5. INNER JOIN nazwa AS n4 ON users_id=n4.nazwa_id
  6. INNER JOIN nazwa AS n5 ON users_id=n5.nazwa_id
  7. itp
tehaha
w większości sytuacji JOIN będzie wydajniejszy niż oddzielne zapytania i na pewno w taki sposób powinieneś uczyć się wyciągać relacyjne dane, a w odpowiedzi na Twoje pytanie: tak jest to dodatkowe obciążenie, ponieważ wyciągasz zestawy danych powiązanych ze sobą z różnych tabeli
wookieb
Załóż odpowiednie indeksy na tabelach to obciążenie spadnie.
lobopol
Mam takie pytanie, a co dadzą indeksy jak joinowanie tabel tworzy w pamięci wirtualną kopie tych 2 i więcej połączonych tabel bez indeksów i na niej działa? Przy dużych tabelach pojawiają się straszne opóźnienia.

Czy mógłby mi to ktoś wyjaśnić? Jest duża szansa, że się mylę, ale w firmie powstał praktycznie zakaz używania joinów i innodb smile.gif
wookieb
Cytat(lobopol @ 31.12.2010, 11:41:31 ) *
Czy mógłby mi to ktoś wyjaśnić? Jest duża szansa, że się mylę, ale w firmie powstał praktycznie zakaz używania joinów i innodb smile.gif

Masakra.

Po pierwsze połączenie tabel odbędzie się tylko na rekordach, które spełnia odpowiednie warunki. Więc nie zawsze oznacza to że całą połączona struktura danych jest tam gdzieś przechowywana nawet jeżeli nie są potrzebne.
InnoDb + indeksy jest lepszą kombinacja niż MyIsam + indeksy z tego względu,że innodb przechowuje główny identyfikator tabeli w każdym indeksie (co prawda czyni je to większymi ale wzrost wydajności jest dość znaczny).
Mysql, pomimo tego jak bardzo się na niego psioczy, bardzo dobrze radzi sobie z indeksami (oraz ich sprytnym wykorzystaniem) tak też im szybciej programiści je poznają tym lepiej dla wszystkich.
Przypadek o którym mówisz może wystąpić przy dziwnych podzapytaniach, unionach oraz źle skonstruowanych zapytań nie używających indeksów.

P.s. Od MyISAM się odchodzi.
lobopol
To teraz mnie zaciekawiłeś, czy mógłbyś mi podać jakąś lekturę (bądź artykuł)? Podobno innodb sprawia bardzo duże problemy z fragmentacją danych.

Sam z chęcią używałem innodb, joinów itd. ale były to nieduże strony więc problemów z wydajnością nie ma, ale na jednym z serwisów z firmy mamy bazę 100gb i na inno z joinami niestety dość wolno to działa (oczywiście indeksy są)
wookieb
Tworzenie indeksów to bardzo wymyślny proces. Zależy do zapytań select, ilości danych przechowywanych oraz selektywności indeksów. Generalnie trochę roboty.
Co do tak dużej tabeli można pomyśleć o zastosowaniu tabel Merge. W ostateczności (jeżeli merge i indeksowanie nie zda egzaminu) należy zastosować inne bazy danych. W przypadku o którym mówisz warto pomyśleć o HBASE, Cassandra. Godna zainteresowanie jest również platforma hadoop.

Info o innodb można uzyskać z manuala. Co do fragmentacji nie pamiętam, ale jutro poszukam info ale na pierwszy rzuk oka raczej lepiej sobie radzi.
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.