Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pytanie o wydajnosc
m2ka
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.07.2008

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


Przepraszam za brak polskich znakow.

Wdalem sie w dyskusje na temat wydajnosci z jednym z kolegow w pracy i chcial bym prosic was o wasze zdanie.

Mamy baze danych a w niej "kilka" tabel i bardzo duzo rekordow ....powiedzmy.

Co jest szybsze:
1 Skomplikowane zapytanie SQL z 4 JOIN'ami

2 Proste zapytania SQL bez JOIN'ow

Nie bierzemy pod uwage czasu na komunikacje miedzy aplikacja a baza danych a we wszystkich przypadkach mamy potrzebne indeksy a baza danych to MySQL (InnoDB).

Ten post edytował m2ka 21.06.2012, 11:21:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Krótka odpowiedź: to zależy.
Długa odpowiedź: Raczej nie da się jednoznacznie odpowiedzieć na to pytanie. Nie wiemy jak dokładnie wyglądają te zapytania, ile danych muszą przetworzyć itp. A nawet jeżeli już znalibyśmy te detale, nadal pozostawałoby pytanie o silnik tabeli (MyISAM/InnoDB), wersję bazy danych czy maszyny na której ona pracuje - to wszystko ma znaczenie. Najprościej byłoby dla Ciebie po prostu sprawdzić doświadczalnie oba rozwiązania. Wtedy będziesz wiedział jak w tej konkretnej sytuacji wyglądają wyniki. Ogólnie w większości przypadków (szczególnie gdy trzeba wykonać złączenia dla wielu rekordów) JOIN powinien być szybszy, w końcu dla relacyjnych baz danych jest to najbardziej naturalne wyrażenie, pod które są one optymalizowane w największym stopniu.
Go to the top of the page
+Quote Post
foxbond
post
Post #3





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

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


Na swoim przykładzie (na moich aplikacjach) mogę śmiało stwierdzić, że JOIN będzie wydajniejsze.
W końcu do tego celu powstały relacyjne bazy danych i należy z tego korzystać.


Jednak z drugiej strony z nieznanych przyczyn na darmowych serwerach lepiej wykonać kilka zapytań niż jedno długie
Go to the top of the page
+Quote Post
m2ka
post
Post #4





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.07.2008

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


Przypominam ze pytanie nie dotycz 4 zapytan vs 1 zapytanie z 4 JOIN'ami tylko 2 zapytan.

W mojej ocenie 2 proste zapytania beda szybsze.
Go to the top of the page
+Quote Post
athabus
post
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Zdecydowanie obstawiam wersję JOIN bo jak rozumiem problem to:

Join
1. zapytanie
2. odpowiedź

Da zapytania
1. zapytanie
2. odpowiedź
2a. wyciągnięcie jakiegoś id z wyniku pierwszego zapytania
3. zapytanie bazujące na wyciągniętym id
4. odpowiedź

Oczywiście w skrajnych przypadkach JOIN może być gorszym wyjściem, ale generalizując wybrałbym JOIN zwłaszcza jeśli mówimy o prostych zapytaniach. Przy prostych zapytaniach pewnie 90% czasu tracisz na komunikację z bazą, a nie na czas oczekiwania na odp. samej bazy (ale to jak pisałeś pomijasz).
Go to the top of the page
+Quote Post
Theqos
post
Post #6





Grupa: Zarejestrowani
Postów: 49
Pomógł: 8
Dołączył: 5.12.2008

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


Cytat(m2ka @ 21.06.2012, 13:14:13 ) *
Przypominam ze pytanie nie dotycz 4 zapytan vs 1 zapytanie z 4 JOIN'ami tylko 2 zapytan.

W mojej ocenie 2 proste zapytania beda szybsze.

A nie prościej zrobić 1 zapytanie bez JOINa? Jak ci zależy na szybkości to się nie trzymasz 3 postaci normalnej.

Natomiast na pytania co jest szybsze, jest jedna prosta odpowiedź: Sprawdź (ewentualnie zmierz).
Go to the top of the page
+Quote Post
nasty
post
Post #7





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Masz tutaj do czynienia z kilkoma roznymi przypadkami:

1. Jesli robisz join po kluczach (klucze sa przechowywane w sposob posortowany), to join dwoch tabel miałby taką złożoność:



Gdzie T1 to rozmiar pierwszej tablicy, T2 rozmiar drugiej tablicy. To oznacza, że baza danych wykona tyle operacji ile jest suma rekordów obu tabel.

2. Jeśli robisz join po kolumnach które nie są kluczami, wtedy naiwny algorytm jest o złożoności kwadratowej: , bo wtedy musi kazdy wiersz porownac z kazdym wierszem z drugiej tabeli. Ale bazy danych stosuja wydajniejsze metody, gdzie najpierw sortuja dane wydajnym algorytmem o zlozonosci



a potem wykonuja ta sama operacje co w przypadku przypadku numer 1, tak, ze zlonozonosc wyjdzie Ci na poziomie:

.

(czyli to samo co #1 + koszt sortowania).

3. Jesli robisz kilka prostych zapyan bez joinów to wykonujesz tyle operacji:



Czyli, tyle ile rowna sie suma wszystkich rekordow we wszystkich tabelach (zostawmy na razie przypadki z predykatami - klauzulami WHERE).


Wniosek: Jak robisz Join po kluczach, to nie ma rożnicy z czystko obliczeniowego punktu widzenia, i to co zaczyna robić różnicę, to ile danych wysyłasz i odbierasz od i do serwera bazodanowego jako overhead. Wiec w przypadku joina po kluczach, warto to robic za jednym zamachem na serwerze bo wtedy nie marnujesz czasu na inicjacje polaczen, obliczanie planu wykonania zapytania i innych rzeczy ktore musza sie wykonac przy kazdym zadaniu, bez wzgledu na jego zlozonosc.

Ten post edytował nasty 27.06.2012, 07:14:24
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 Aktualny czas: 21.08.2025 - 22:37