Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolejnosc Join 'owania tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
Kuziu
Witam serdecznie,

Ostatnio zadziwiło mnie coś w moim zapytaniu.
Mianowicie po przestawieniu 2 słów, czas zapytania spadł z 11s do 0.5s

  1. SELECT login, time, name, objects.id, elements, objects.obieg, users.id AS userid
  2. FROM objects
  3. LEFT JOIN objstates ON(objstates.objid = objects.id AND objstates.state = objects.currentstate) LEFT JOIN users ON (users.id = objstates.userid) WHERE currentstate='accepted' AND projid='19' AND actual='1' ORDER BY objstates.time, name


A dokładniej chodzi o ten kawałek

  1. ...
  2. FROM objects
  3. LEFT JOIN objstates ON(objstates.objid = objects.id AND objstates.state = objects.currentstate) LEFT JOIN ...


Gdy zamienię objects LEFT JOIN objstates na objstates LEFT JOIN objects
zapytanie zyskuje tyle czasu.

I teraz moje pytanko
Skąd mam wiedzieć do których tabel odwoływać się najpierw ?

Czytałem że LEFT JOIN na dużych tabelach spowalnia bardzo co można stosować w zamian ?

Wielkie dziękki za pomoc !
angrysmiley.gif
tort
To oczywiste: tabela z lewej strony jest tabelą chronioną, tzn. dla każdego rekordu należącego do tej tabeli i spełniającego kryteria wyszukiwania wykonywany jest non-equi-join (w tym wypadku left join). Jeśli zatem tabela chroniona jest duża, to i wykonanie złączenia trwa długo. Jeśli jest mała, to wykonanie złączenia trwa odpowiednio krócej. Wniosek: po lewej stronie złączenia powinna byc tabela z jak najmniejszą liczba rekordów.
Kuziu
A czy mozna coś stosować zamiast LEFT JOIN ?

Niektórzy piszą tak

  1. SELECT id, login, costam
  2. FROM news,
  3. users WHERE news.userid = users.id


Czym to się różni od:

  1. SELECT id, login, costam
  2. FROM news
  3. LEFT JOIN users ON (news.userid = users.id)


questionmark.gif
tort
Oj kochany, nie masz podstaw. Poczytaj sobie manual MySQLa. W skrócie: LEFT JOIN złącza wszystkie rekordy z tabeli po lewej stronie z odpowiadającymi im rekordami z tabeli po prawej stronie, a jak nie ma rekordu, który odpowiadałby, zwraca NULL, a złączenie i tak się dokonuje. Użycie WHERE tabela1.id=tabela2.id dokonuje złaczenia tylko pasujących rekordów.
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.