Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Czy na 3 tabelach po 2000 rekordow mozna uzyc LEFT JOIN ?, Pytanie odnoscie szybkosci MySQL
thornag
post 12.06.2006, 15:09:27
Post #1





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


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.


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
SongoQ
post 12.06.2006, 15:29:18
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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.


--------------------
Go to the top of the page
+Quote Post
thornag
post 12.06.2006, 15:43:28
Post #3





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


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.

Ten post edytował thornag 12.06.2006, 15:46:11


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
ActivePlayer
post 12.06.2006, 16:03:19
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


przenosze do mysql.
Go to the top of the page
+Quote Post
bendi
post 12.06.2006, 17:09:55
Post #5





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

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


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


Ten post edytował bendi 12.06.2006, 17:11:15


--------------------
Go to the top of the page
+Quote Post
DeyV
post 13.06.2006, 07:56:06
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




@ 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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
SongoQ
post 13.06.2006, 08:45:18
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@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.


--------------------
Go to the top of the page
+Quote Post
thornag
post 13.06.2006, 14:56:47
Post #8





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


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 ?


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

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 Wersja Lo-Fi Aktualny czas: 12.06.2025 - 15:20