![]() |
![]() |
![]()
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 |
|
|
![]() |
![]()
Post
#2
|
|
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ść: (IMG:http://img827.imageshack.us/img827/6810/gifpz.gif) 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: (IMG:http://img26.imageshack.us/img26/4808/gifebu.gif) , 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 (IMG:http://img526.imageshack.us/img526/2913/gifov.gif) a potem wykonuja ta sama operacje co w przypadku przypadku numer 1, tak, ze zlonozonosc wyjdzie Ci na poziomie: (IMG:http://img198.imageshack.us/img198/1931/gifpk.gif) . (czyli to samo co #1 + koszt sortowania). 3. Jesli robisz kilka prostych zapyan bez joinów to wykonujesz tyle operacji: (IMG:http://img515.imageshack.us/img515/6955/gifea.gif) 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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 19:09 |