Optymalizacja prostego zapytania

Odpowiedz Nowy wątek
2011-07-21 13:16
pytajacy
0

Mam takie drobne pytanie dotyczące optymalizacji prostego zapytania
posiadam tabelki (dla uproszczenia przyjmijmy że wszystko jest liczbami)

założenia
-Każdy user może należeć do wielu grup
-Każda grupa może zawierać wiele sekcji

co w czym
tabela USER_GROUP:
zawiera Liste w postaci
id_usera oraz Id grupy do której dany user należy wraz z czasem
przynaleznosci od dnia do dnia.

tabela GROUP_SECTION
zawiera id_grupy oraz id_sekcji należącej do grupy
(jedna grupa może zawierać wiele sekcji)

TABELE:

*USER_GROUP
ug_id
user_id
group_id
member_from
member_to

*GROUP_SECTION
gs_id
group_id
section_id

WĄTPLIWE ZAPYTANIE mające na celu wybranie tych sekcji do których ma dostep uzytkownik:

SELECT USER_GROUP.*, GROUP_SECTION .section_id
FROM `USER_GROUP` 
JOIN GROUP_SECTION ON USER_GROUP.group_id = GROUP_SECTION.group_id
WHERE USER_GROUP.user_id =1

Zapytanie najpierw to zapytanie pobierze wszystko z tabeli USER_GROUP
zrobi JOINA z GROUP_SECTION i wybierze rekordy z podanym id usera

a powinno

  • pobrać z tabeli USER_GROUP tylko te krotki w których jest
    USER_GROUP.user_id =1 i dopiero wtedy połączć to joinem z tabelą GROUP_SECTION po
    USER_GROUP.group_id = GROUP_SECTION.group_id

Jak tego dokonać bo próbuję i nie działa nic :)

Pozostało 580 znaków

2011-07-21 13:58
0
  1. Skąd wiesz ze tak się to wykona? Przecież to zalezy od silnika bazy danych i jestem prawie pewien ze on to sobie zoptymalizuje
  2. Jak ci bardzo zależy to zamień joina na podzapytanie, ale przypuszczam ze różnicy w czasie wykonania nie będzie.

Pozostało 580 znaków

2011-07-21 14:11
pytający
0

Tego nie wiem, czy zostanie to zoptymalizowane czy też nie, ale zakładając że nie nastąpi optymalizacja to właśnie tak to się wykona czyli zrobi gigantycznego joina
(połaczy wszystkich id grup dla kazdego usera z sekcjami a na końcu zrobi warunek where)
zamiast wybrać garstkę krotek najpierw (tylko te grupy do których należy user, a nastepnie join a dopiero potem join grup z sekcjami). pytam więc jak to optymalniej zapisać :)

Pozostało 580 znaków

2011-07-21 14:31
0

Ale to właśnie jest twój problem ;) Zapytania na prawdę są sensownie optymalizowane... Ale jak musisz to zrób tak

SELECT users.*, groups.section_id
FROM GROUP_SECTION AS groups
INNER JOIN (SELECT * FROM USER_GROUP WHERE user_id =1) AS users ON groups.group_id = users.group_id

Ale wzrostu wydajności bym się nie spodziewał...

edytowany 1x, ostatnio: Shalom, 2011-07-21 14:31

Pozostało 580 znaków

2011-07-21 14:41
pytajacy
0

Dziękuję , ja myślę że pewnie w tym masz rację że są optymalizowane ale wolę pisać tak by nie trzeba było zakładać że sobie to zoptymalizuje
mając np 1000 userów każdy po 5 grup w najgorszym wypadku wzieło by do joina bez optymalizacji 5000 rekordów a tak weźmie 5 :>

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0