Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Select w select czy join-y
marcio
post
Post #1





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Czesc nie znam sie bardzo na bazach danych i chcialem sie zapytac powiedzmy ze musze pobrac dane z 3 tabel users,ban i active_account i nawet gdy nie znajdzie rekordu w ktorejs z tabel to ma zwrocic null czyli w tym przypadku uzywajac relacje musze uzyc LEFT JOIN

I problem polega na tym lepiej jest wykonywac takie zapytania w ten sposob:
  1. SELECT *
  2. FROM users
  3. LEFT JOIN ban ON ban_user = users.login
  4. LEFT JOIN active_account ON active_user_id = users.id
  5. WHERE login = 'vodka'
  6. LIMIT 1

Czy:
  1. SELECT * , (
  2. SELECT id
  3. FROM ban
  4. WHERE ban_user = 'vodka'
  5. ) AS banned , (
  6. SELECT id
  7. FROM active_account
  8. WHERE active_user_id = users.id
  9. ) AS active
  10. FROM users
  11. WHERE login = 'vodka'
  12. LIMIT 1

Ktore zapytanie jest bardziej wydajne?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
Zdecydowanie zapytanie ze złączeniami jest bardziej wydajne. Z podzapytaniami trzeba uważać, bo zazwyczaj to podzapytania wpływają na spadek wydajności.
- będę ostro polemizował.

Joiny strasznie spowalniają, zwłaszcza do dużych tabel. Join jest po to, żeby np. pobrać nazwę województwa na podstawie jego ID wtedy, jeśli jest to potrzebne. Używanie joina żeby np. dodać do całego zapytania where to moim zdaniem nieporozumienie i niezrozumienie istoty działania tego, to tak jakby zamiast where używać having. Jak chcecie to sami sprawdźcie na takim typowym przykładzie:

Źle:
  1. SELECT * FROM products
  2. JOIN category_has_product ON category_has_product.id_product = products.id
  3. WHERE category_has_product.type=3


Lepiej:
  1. SELECT * FROM products
  2. JOIN category_has_product ON category_has_product.id_product = products.id AND category_has_product.type=3


Najlepiej:
  1. SELECT * FROM products
  2. WHERE id IN(SELECT id_product FROM category_has_product WHERE type=3)


Dwa proste i szybkie selecty, jak mamy indeksy to śmiga jak burza, join w tym wypadku to takie babranie się, chcemy przecież tylko pobrać produkty z kategorii określonego typu. Kto mi nie wierzy niech sam zrobi testy. Zresztą czemu wielu programistów zamiast jednego zapytania pełnego joinów robi kilka prostych? Bo tak jest szybciej a kiedyś nie było takich możliwości używania podzapytań.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 18:26