ORDER BY na bardzo dużej bazie danych

Odpowiedz Nowy wątek
2019-08-05 19:57
0

Problem wygląda następująco.

Mam bazę danych z około 15tys produktów. Każdy z nich ma ok 250 atrybutów.
Problem pojawia się przy zaawansowanym szukaniu, które uwzględnia szukanie po kilku z atrybutów. I tak standardowe zaawansowane zapytanie trwa nawet 16sek i potrafi analizować nawet do 12mln rekordów (Rows_examined)
Po usunięciu zapisu ORDER BY cały proces trwa mniej niż 1sek i wyniki zwracane są prawie w czasie rzeczywistym.

Zależy mi jednak na pozostawieniu sortowania, gdyż znacznie to ułatwia przeglądanie ofert.
Przykładowo jednym z atrybutów jest cena_produktu wiec nie wyobrażam sobie serwisu, który takiego sortowania nie udostępnia.

Czy jest jakiś sensowny sposób na zastosowanie ORDER BY cena_produktu ASC/DESC nie wpływający aż tak bardzo na czas całego zapytania? Dodam jeszcze, że stosuję paginację wiec w zapytaniu pojawia się LIMIT x, y

Myślałem nad pobraniem wszystkich danych (bez porcjowania LIMITem) i na rezultatach tego zapytania (czyli jak już mam właściwe rekordy) wykonać ORDER. Niestety jakoś z tym sobie nie mogę poradzić.

Będę wdzięczny za każdą, nawet najmniejszą wskazówkę :)

Pozostało 580 znaków

2019-08-05 19:59
1

Dodaj index na kolumnie używanej w order by.

Pozostało 580 znaków

2019-08-05 20:12
0

@serek
Nie wiem czy aktualna struktura bazy mi na to pozwoli?
Tak w skrócie:

jeśli chodzi o tabelę to wygląda to następująco:
produkt (id, sortowanie, licznik, data_dodania)
produkt_wartosc(id, nazwa, opis, id_produkt, seo, jezyk)
atrybut (id, sortowanie)
atrybut_wartosc (id,nazwa,wartosc,id_atrybut,jezyk)
produkt_atrybut(id,id_atrybut, id_produkt)
produkt_atrybut_wartosc(id, wartosc, id_produkt_atrybut, jezyk)

Czyli defacto robię ORDER BY na polu produkt_atrybut_wartosc.wartosc , gdzie atrybut.id jest równe np 3 (bo atrybut z id=3 to cena)

entywzorzec EAV ? - Miang 2019-08-10 12:54

Pozostało 580 znaków

2019-08-05 21:31
1

Kolumna po której jest order powinna być w głównej tabelce a nie dodatkowych, wtedy to i miliony rekordów możesz mieć i nie odczujesz tak radykalnego zmulenia.

Pozostało 580 znaków

2019-08-05 23:10
0

Pokaż zapytanie.

Pozostało 580 znaków

2019-08-06 10:55
0

Zapytanie na pastebin - żeby zachować formatowanie :)

http://pastebin.com/raw/1W4LUJDT

Pozostało 580 znaków

2019-08-06 10:59
1

ten order by to porażka w tym zapytaniu, pomijając już całą resztę. Mogę ci powiedzieć, że wywalenie replaca już da bardzo dużo na wydajności. W ogóle cena powinna być trzymana jako liczba i już byś problemu w ogóle nie miał.

edytowany 2x, ostatnio: mr_jaro, 2019-08-06 11:03

Pozostało 580 znaków

2019-08-06 11:17
3

To nie ORDER BY jest problemem, tylko to, co się w nim dzieje... To jest zapytanie skorelowane, czyli aby posortować po nim, to musi najpierw wykonać to zapytanie tyle razy, ile jest rekordów w tabeli... Nie dziwię się, że to tyle trwa.

a jakaś porada, jak to usprawnić? :P - cerrato 2019-08-06 11:30
Napisać na nowo np. używając JOINów :P - Marcin.Miga 2019-08-06 12:55

Pozostało 580 znaków

2019-08-06 13:18
3

Najszybsza, choć nie najlepsza, metoda to sortować coś, co już zostało wybrane z bazy danych. W takim wypadku zapytanie dzielimy na dwa etapy. W pierwszym wybierasz wszystko, co cię interesuje, a w kolejnym sortujesz i ograniczasz.

https://4programmers.net/Pastebin/11331

Koledzy SQLowcy mnie za to pewno zjedzą, ale to jest najprostsza (pojęciowo) metoda.

Pozostało 580 znaków

2019-08-06 13:36
1

@Koziołek: To nic nie da. I tak musi wykonać ileś tam (z tego co mówi TYSIĘCY) razy zapytanie skorelowane. To tyle trwa. Zapytanie jest całe do przepisania.

Pokaż pozostałe 2 komentarze
A jeśli możesz, to daj przykład na JOINach - może się przydać zarówno pytającemu, jak i potomnym :) - cerrato 2019-08-06 15:02
@cerrato ale dziś "dżelendżujesz" .. chwali się, chwali ;) - BlackBad 2019-08-06 15:13
Nie dam.... Nie znam bazy, a na podstawie skopanego zapytania nie chce mi się domyślać... No i mam już dwa "challenge". Jeden prywatny, jeden zawodowy... Na trzeci brak czasu. - Marcin.Miga 2019-08-06 15:40
@Koziołek: w wiekszosci technologii niestety musisz sam piramidke tmp tabel zbudowac, na szczescie niektore IDE wspieraja wyklikiwanie ich (zwlaszcza gdy select lista ogromna) - INTERFERON_ALFA_STG 2019-08-07 14:57
W Mssql też można zrobić with i to pewnie podbije trochę prędkość. Mimo wszystko lepiej to joinem ogarnąć, tylko trzeba dobrze połączyć. - kate87 2019-08-11 14:49

Pozostało 580 znaków

2019-08-06 17:38
0

Dziękuję za wszystkie sugestie.
Baza niestety jest na tym etapie już nie do ruszenia. Pomijam fakt ilości danych - oprócz tego są integracje, które niestety na tej strukturze bazują. Przepisanie ich wiąże się tak na prawdę z postawieniem serwisu od nowa.

@Marcin.Miga gdybyś jednak znalazł troszkę wolnego czasu i zechciał skonstruować zapytanie z JOIN'ami to będę bardzo wdzięczny.

@mr_jaro jakby nie patrzyć cena to też atrybut.. Czysto hipotetycznie: czy przesunięcie jej (ceny) do tabeli produkt cokolwiek da? Indeksu nadal nie będzie.

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