Optymalizacja bazy danych - prośba o pomoc.

Odpowiedz Nowy wątek
2013-09-18 10:14
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

  • baza.jpg (0,03 MB) - ściągnięć: 309
edytowany 1x, ostatnio: hipekk, 2013-09-18 10:21
Jak widzę * i GROUP BY to jestem w stanie pozabijać... - Marcin.Miga 2013-09-18 10:36

Pozostało 580 znaków

2013-09-18 10:33
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` 

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2013-09-18 10:53
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

edytowany 1x, ostatnio: hipekk, 2013-09-18 10:53

Pozostało 580 znaków

2013-09-18 11:02

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2013-09-18 11:07
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)

:)

edytowany 2x, ostatnio: hipekk, 2013-09-18 11:09

Pozostało 580 znaków

2013-09-18 11:31
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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2013-09-18 11:42
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 :)

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