Czy w MySQL trzeba unikać group by ?

Odpowiedz Nowy wątek
2016-12-15 20:09
Uczynny Kaczor
0

CZeść,

mam taki problem z MySQL, że przy użyciu group by zapytanie wykonuje się 20-30% dłużej i tak się zastanawiam czy ja mam złe zapytanie czy muszę zmienić strukturę bazy by uniknąć grupowania

SELECT `product_name`.`name`, `product_name`.`id`, `product`.`id` AS `product_id` 
FROM (SELECT `name`, `id` from product_name WHERE MATCH (name) AGAINST ('led' IN BOOLEAN MODE)) as product_name 
LEFT JOIN `product` ON `product_name`.`id` = `product`.`name_id` 
LEFT JOIN `product_group_relation` ON `product`.`id` = `product_group_relation`.`product_id`
GROUP BY `product_group_relation`.`product_group_id` LIMIT 20

struktura product_group_relation
product_group_id | product_id
85232 | 487931
85233 | 487932

product_group_relation określa które produkty są ze sobą powiązane, sprawdza to na podstawie nazwy, bo jak widać posiadam tabelkę product_name by trzymać w niej unikalne nazwy produktów i nie duplikować ich co się zdarza, ta sama nazwa produktu inny sklep. No i ten nieszczęsny group by -30% do wydajności obecnie jest 50tyś produktów wykonanie zapytania zajmuje średnio 90.4 ms + count dla paginacji, niby niewiele ale produktów ma być 3mln, da się to jakoś szybciej pobrać ?

Pozostało 580 znaków

2016-12-15 20:33
0

Zacznij od wygenerowania planu zapytania a nie od wróżenia z kuli.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Plan zapytania dla MySQL? To już lepiej użyć tej kuli. - somekind 2016-12-16 14:15
Dlaczego nie ma plusów za kometarze. Dałbym Ci plusa. - Krolik 2016-12-20 10:31

Pozostało 580 znaków

2016-12-15 20:41
1

Shalom ma racje.

Co do reszty to nie bardzo rozumiem sens zapytania z group by, bez pokazania kolumny po której grupuje, jak i nie umieszczeniem w group by wszystkich kolumn bez agregacji, dobrze że mySQL to rozumie ;)

No tylko MySQL potrafi agregować bez grupowania i grupować po czymkolwiek. - somekind 2016-12-16 14:16
MySQL mnie w takich sytuacjach przeraża ;) - Panczo 2016-12-16 14:18

Pozostało 580 znaków

2016-12-15 21:07
Uczynny Kaczor
0

title
jakby nie działało zdjęcie z explain https://s29.postimg.org/92n4wqjwl/explain.png

czasem do zapytania dochodzi warunek z EAV po cenie produktu, ale to na razie zostawmy

Pozostało 580 znaków

2016-12-15 21:15
Uczynny Kaczor
0

to jeszcze oceńcie strukturę, mam nadzieje, że mniej więcej wiadomo o co chodzi

title

Pozostało 580 znaków

2016-12-15 22:05
0

Pierwsze co mi się nie podoba to ten match, szczególnie że w rzeczywistości chyba chciałeś tam po prostu zrobić like jako warunek where, a zrobiłeś podzapytanie i fulltext search

W ogóle nie pojmuje sensu tej tabeli relation. Czemu po prostu produkty nie mają powiązania z Id w tabeli product_name jeśli już? Tylko masz pomiędzy jeszcze jakąś kolejną tabelę co tylko komplikuje sprawę. No i całe to grupowanie też jest bez sensu skoro tam jest 1:1.

Chyba sensowniej byłoby mieć jakieś

select distinct product_name, product_id 
from products
left join product_names on products.name_id = product_names.id
where product_name like "% led %"
limit 20

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-12-15 22:37
Uczynny Kaczor
0
Shalom napisał(a):

Pierwsze co mi się nie podoba to ten match, szczególnie że w rzeczywistości chyba chciałeś tam po prostu zrobić like jako warunek where, a zrobiłeś podzapytanie i fulltext search

Wyszło mi trochę szybciej wykonanie zapytania

W ogóle nie pojmuje sensu tej tabeli relation. Czemu po prostu produkty nie mają powiązania z Id w tabeli product_name jeśli już? Tylko masz pomiędzy jeszcze jakąś kolejną tabelę co tylko komplikuje sprawę. No i całe to grupowanie też jest bez sensu skoro tam jest 1:1.

w product_name jest unique ,ale product posiada kolumnę name_id która się duplikuje, a ja potrzebuję tylko pierwszy lepszy produkt, bo potem sobie pobieram w osobnym select jego grupę i produkty pokrewne product_group_relation

edytowany 1x, ostatnio: Shalom, 2016-12-15 22:50

Pozostało 580 znaków

2016-12-15 22:58
Uczynny Kaczor
0
Shalom napisał(a):

Chyba sensowniej byłoby mieć jakieś

select distinct product_name, product_id 
from products
left join product_names on products.name_id = product_names.id
where product_name like "% led %"
limit 20

Pytanie czy warunek z użyciem table EAV mi zadziała przy DISTINCT i wybierze odpowiedni produkt ?

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