Czy w MySQL trzeba unikać group by ?

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ć ?

0

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

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

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

0

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

title

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

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 ?

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