Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Czy na 3 tabelach po 2000 rekordow mozna uzyc LEFT JOIN ?
Forum PHP.pl > Forum > Bazy danych > MySQL
thornag
Przypuscmy tabele...

users => user_id, password, e-mail, tel, adres, imie, nazwisko, login

nazwa_samochodu => user_id, nazwa_samochodu.

telewizory => user_id, marka_tv

Tabele maja powiedzmy 2000 rekordow.

Kazdy user ma i samochod i telewizor (utopijnie tongue.gif)

Teraz chcialbym w wierszu wyswietlic wszystkie informacjie, w nastepnym nastepnego usera i az do 2000 smile.gif



Slyszalem ze stosowanie LEFT/RIGHT JOIN itp na duzych tabelach jest bardzo wolne (nei wiem wszak co dla MySQL to duza tabela).

Jak myslicie ? Zmiksowac to w jedna tabele czy uzyc laczenie tabel ? A moze inny sposob na ktory nie wpadlem.
SongoQ
Kazda operacja zlaczen jest wolna. LEFT JOIN jest tutaj dobrym podejsciem. Jesli chcesz naraz wyswietlic 2k rekordow to blad. Zrob porcjowanie czyli LIMIT i czas bedzie zadowalajacy. Wazne aby indeksy byly na polach zlonczen i na warunkach.
thornag
Propo porcojowania -> swietna mysl zupelnie zapomnialem o limicie.

Mam maly problem z LEFT JOINEM... Zapytanie skonstruowalem zgodnie z ksiazka ( nie chce reklamowac) wyglada nastepujaco:


  1. SELECT users.*, nazwa_samochodu.nazwa_samochodu, telewizory.marka_tv
  2. FROM users LEFT JOIN nazwa_samochodu ON users.user_id=nazwa_samochodu.user_id
  3. LEFT JOIN telewizory ON nazwa_samochodu.user_id=telewizory.user_id


Nie pobiera rekordow w dalszym ciagu, a ja nie moge zlokalizowac bledu.

Dodam tylko ze wszelkie ORDER BY LIMIT sa w zapytaniu nie bylo sensu wypisywac bo nie dotycza pytania.

Ktos moze mi pomoc z zapytaniem ? Albo nakierowac na dobre zrodlo ? Wszedzie gdzie szukalem wyjasnienie do mnie nie dociera albo podaja gotowe przyklady a gotowiec mnie nie interesuje bo chce zrozumiec.
ActivePlayer
przenosze do mysql.
bendi
Jeżeli chodzi o samo zapytanie, to bez struktury bazy danych ciezko cos bedzie powiedziec.

A jeżeli chodzi o LIMIT to niesugerowałbym się tym rozwiązaniem, bo ono tylko ogranicza wyniki zwracane klientowi a serwer i tak musi przemielić wszystkie rekordy dlatego tez:
  1. SELECT * FROM tabela LIMIT 10000, 10010;

Jest odradzanym zabiegiem, bo serwer mysql'a i tak musi przemielić wszystkie 10010 rekordów żeby zwrócić te właściwe 10, więc zysk żaden. Lepiej to zrobić przez WHERE,

np zakładając, że mamy w polu id i znamy id'k ostatnio zwróconego ostatniego rekordu to można tak:
  1. SELECT * FROM tabela WHERE id > 5000 LIMIT 10
DeyV
@ bendi - nie wiem, gdzie znalazłeś takie zalecenie, ale nie ma ono zbyt dużo sensu.
W ten sposób nie można zbudować poprawnego LIMIT, a bez tego nie możliwe byłoby żadne stronicowanie itp.
Zresztą - w obu przypadkach baza danych może wykorzystać indexy, tak więc rożnica w wydajności nie powinna być zauważalna.

@ thornag - Wszelkiego rodzaju JOIN'y rzeczywiście spowalniają zapytanie. Jednak różnica czasu wykonywania, przy poprawnie skonstruowanej bazie (z indexami oraz związkami tylko na polach liczbowych) różnica czasów staje się zauważalna dopiero przy NAPRAWDĘ dużych tabelach.
NAPRAWDĘ oznacza "nieco więcej" niż 2tyś rekordów - MySQL sprawnie sobie radzi z tworzeniem związków pomiędzy tabelami z milionami rekordów.
Stąd też standardem są zapytania, w których wykorzystywane jest wiele JOIN'ów równocześnie, a mimo to chodzą one bardzo sprawnie.
SongoQ
@DeyV Zgadzam sie z Toba odnosnie wypowiedzi @bendi Limit jest po to zeby go stosowac. Teoretycznie powinno to tak wygladac ze zwraca rekordy wedlug wewnecznych oid (jak w pg). Stosowanie takie jak zaleca bendi jest tylko wymagane w ORACLE bo tam nie ma czegos takiego jak LIMIT. Jesli chcemy natomist w mysqlu stosowac samo WHERE do ograniczenia zbioru to nie daje sie limit (bo po co?) wszystko mozna zalatwic WHERE. Oczywiscie pod warunkiem ze warunkiem jest pole z indeksem.
thornag
Struktura bazy danych:

Pierwsza tabela (gowna)

user_id => int => primary key (reszta danych mysle niewazna)

Nastepne dwie maja dwa pola

user_id => int => index (nie wiem czy tutaj tez primary key czy index wsyatrczy)
pole1 => text (z tego nie kozystam w zadnej relacji)

I nadal mam problem ze skonruowaniem zapytania. To jak z metodologia tongue.gif Kompletnie mi nie wchodzi smile.gif



I jeszcze jedno pytanie.

Czy wyciagajac rekord z tabeli zapytaniem podobnym do :

  1. SELECT user_id FROM users WHERE username = '$user'


Musze pozniej robic mysql_fetch ? Czy skoro jest wyciagana tylko jedna zmeinna mozna jrj uzyc bezposrednio ?
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-2024 Invision Power Services, Inc.