sannin
5.07.2009, 23:36:42
Witam,
mam takie zapytanie
SELECT data_kody.id, data_kody.kod, data_artykuly.nazwa, dataWydania, iloscPran, iloscNapraw, wPralni, data_pracownicy.imie, data_pracownicy.nazwisko
FROM data_kody LEFT JOIN data_artykuly ON data_artykuly.idArtykulu = data_kody.idArtykulu
LEFT JOIN data_pracownicy ON data_kody.idPracownika = data_pracownicy.idPracownika AND data_kody.idStacji = data_pracownicy.idStacji
WHERE data_kody.idStacji = 13
Wykonywanie tego zapytania trwa około 7 sek to sporo... zastanawiam się tylko czy jest ono mało optymalne czy to normalne? W tabeli data_kody jest około 180 tys wpisów, a w data_pracownicy około 1,2 tys. Czy da się jakoś to zoptymalizować?
TheaSiX
6.07.2009, 00:00:25
Czy wyświetlasz wszystkie te rekordy na jednej stronie? Zakładam, że nie, więc może warto byłoby użyć opcji LIMIT, by pobierać tylko dany przedział rekordów. Przy tak dużej bazie jest to myślę dość optymalne wyjście.
sannin
6.07.2009, 00:17:19
W oryginale limit jest... ale nie daje to za dużo.... a raczej prawie nic
dr_bonzo
6.07.2009, 01:13:55
A masz pozakladane indeksy na kolumny po ktorych joinujesz?
sannin
6.07.2009, 01:59:53
Nie, a czy to coś da i jakie ustawić? Chodzi Ci o primary itd. dla jasności?
Savage.Mephisto
6.07.2009, 08:33:49
Indeksy skracają czas potrzebny na wyszukanie i odczytanie żądanych danych z bazy danych. W phpMyAdmin, pod tabelą z danymi, na dole masz możliwość utworzenia indeksów dla poszczególnych kolumn. Wystarczy tylko użyć opcji 'Utwórz indeks dla 1 kolumny -> Wykonaj'.
sannin
6.07.2009, 17:15:13
Teraz mam jeszcze pytanie, jak zrobię te indexy i do tabeli dojdą nowe rekordy to nie będzie problemów, czy będą one dostępne?
dr_bonzo
6.07.2009, 17:22:31
A czemu mialy by nie byc dostepne? Indeks aktualizuje sie po zmianach w tabeli.
sannin
6.07.2009, 17:38:34
Dobra dzięki... już prawie kumam teraz mam tylko pytanie na które kolumny pozakładać indexy? Czytałem w google, ale nie do końca kumam te przykłady czy może ktoś w jednym zdaniu łopatologicznie mi to wyjaśnić. Przy okazji lekko zmieniłem zapis
SELECT k.id, k.kod, a.nazwa, dataWydania, iloscPran, iloscNapraw, wPralni, p.imie, p.nazwisko
FROM data_kody k
LEFT JOIN data_artykuly a USING(idArtykulu)
LEFT JOIN data_pracownicy p USING(idPracownika, idStacji)
WHERE k.idStacji = 13 LIMIT 0, 50
seth-kk
6.07.2009, 17:57:15
na klucze obce
sannin
6.07.2009, 18:07:10
bardziej chodzi mi o to czy na wybierane czy też na te w porównaniach?
Nadałem dla
Cytat
idPracownika, idStacji, idArtykulu
śmiga pięknie 0,06 sek

dzięki wielkie wszystkim
seth-kk
6.07.2009, 18:07:58
przy tak niewielkiej ilosc przeszukiwanych kolumn raczej nie zaszkodzi na wszystkie (biorace udzial w szukaniu)
sannin
6.07.2009, 18:26:05
Ok zaraz jeszcze po testuje. Nadałem jeden index dla 2 kolumn (idPracownika, idStacji) (UNIQUE) czy dobrze zrobiłem?
seth-kk
6.07.2009, 19:14:14
tak dopuki bedziesz szukal po obu kolumnach jednoczesnie
dr_bonzo
6.07.2009, 20:31:05
Cytat(sannin @ 6.07.2009, 19:26:05 )

Ok zaraz jeszcze po testuje. Nadałem jeden index dla 2 kolumn (idPracownika, idStacji) (UNIQUE) czy dobrze zrobiłem?
A czemu go dodales wlasnie tak?
Jak po to zeby zezwolic na tylko jeden rekord o idPracownika i idStacji - to dobrze.
Jak po to zeby przyspieszyc Joiny - to zle, bo powiniens dodac po 1 indeksie zwyklym na kazda z tych 2ch kolumn.
viking
7.07.2009, 04:57:48
Zobacz takie rzeczy EXPLAIN i ANALYZE bo zapytania to specyficzna sprawa gdzie nie da się jednej konkretnej odpowiedzi udzielić. Jeśli zobaczysz że zapytanie korzysta z indeksów a czas będzie lepszy znaczy że idziesz w dobrym kierunku
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.