Optymalizacja bazy danych - prośba o pomoc.

0

Witam.

Mam bazę danych MySQL która wygląda mniej więcej tak (z góry przepraszam za błędy w diagramie - nie mam zupełnie doświadczenia w tego typu grafach).

baza.jpg

tabela oferta zawiera oferty poszczególnych klientów
tabela zamowienia_poz zawiera pozycje wybranych zamówień danego klienta

Problemem jest zapytanie które zwróciło by ofertę klienta X wraz z ilościami z zamówienia Y.
Np.

 SELECT * 
FROM  `oferta` 
LEFT JOIN  `zamowienia_poz` ON  `id_towar` =  `id_towaru` 
AND  `id_zamowienia` =1661
WHERE  `id_kontrahenta` =52
GROUP BY  `id_towar` 

Wykonanie zapytania trwało 22.1910 sekund(y)

tabela oferta ma w tej chwili 54,618 rekordów
tabela zamówienia_poz - 15,558 rekordów

czy możecie mi podpowiedzieć jak zmodyfikować zapytanie, bądź jak przebudować bazę aby wykonywało się to szybciej ?

Z góry dziękuję za pomoc.
Pozdrawiam

1

co pokazuje

EXPLAIN SELECT * 
FROM  `oferta` 
LEFT JOIN  `zamowienia_poz` ON  `id_towar` =  `id_towaru` 
AND  `id_zamowienia` =1661
WHERE  `id_kontrahenta` =52
GROUP BY  `id_towar` 
0

Tabela ta nie zawiera unikalnej kolumny. Funkcje związane z edycją siatki, pól wyboru, edycji, kopiowania i usuwania łącza może nie działać.

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | oferta | ALL | NULL | NULL | NULL | NULL | 54618 | Using where; Using temporary; Using filesort
1 | SIMPLE | zamowienia_poz | ALL | NULL | NULL | NULL | NULL | 15558

1

nie masz tam żadnych indeksów więc się nie dziw, że to zajmuje tyle czasu

create index `idx_1` on `oferta`(`id_kontrahenta`, `id_towar`);
create index `idx_2` on `zamowienia_poz`(`id_zamowienia`, `id_towar`);

jak to wykonasz to daj jeszcze raz explain

0

Ja się wcale nie dziwie... wiedziałem że musiałem popełnić błędy stąd prośba o pomoc...

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | oferta | ref | idx_1 | idx_1 | 4 | const | 880 | Using where
1 | SIMPLE | zamowienia_poz | ref | idx_2 | idx_2 | 8 | const,avexim_lazarus.oferta.id_towar | 1

Wynik pierwszego zapytania po stworzeniu indeksów:

Wykonanie zapytania trwało 0.0026 sekund(y)

:)

0

tylko musisz mieć świadomość, że indeksy tworzy się pod konkretne zapytania. Indeksy stworzone "na czuja", czyli takie, które powinny być często wykorzystywane pokrywają większość zapytań. Jednak może się zdarzyć, że dla konkretnych zapytań trzeba tworzyć osobny zestaw indeksów. Dlatego raz stworzone indeksy nie wystarczają zazwyczaj na zawsze

0

abrakadaber szczerze mówiąc nie do końca rozumiem działanie oraz to w jaki sposób indeksy powinno się tworzyć...
Dlatego też w najbliższym czasie spróbuję poczytać trochę ogólnie na temat baz danych i ich projektowania (może jest jakaś książka godna polecenia ?).

Bardzo dziękuję za pomoc :)

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