Optymalizacja prostego zapytania

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 :)

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.
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ć :)

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

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 :>

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