Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak przyspieszyć ten kod?
Forum PHP.pl > Forum > Bazy danych > MySQL
Piccolo
Mam zrobioną wyszukiwarkę numerów i przy poniższym kodzie wyszukiwanie trwa kilkadziesiąt sekund na dysku lokalnym. Próbowałem korzystać z LEFT JOIN, ale nie wychodziło mi z trzema tabelami, na dwóch chulało, a przy jakiejkolwiek próbie dodania trzeciej tabeli do SELECT-a wywalało błąd.

Oto kod SELECT-a:

  1. ("SELECT vehicle.*, tabele2.NR_TAB, tabele2.NT, data.NR_RYS, data.OPIS, data.NR_KOD
  2. FROM vehicle, tabele2, data
  3. WHERE data.NR_RYS LIKE '%$search%' AND tabele2.NR_KOD = data.NR_KOD AND data.MOD = vehicle.MOD
  4. ORDER BY data.NR_RYS, tabele2.NR_TAB, vehicle.MOD ASC");


Proszę o pomoc, bo nie wiem jak z tego wybrnąć. Nie jestem jeszcze zaawansowany w programowaniu. Przeszukałem zasoby forum i nie znalazłem nic ciekawego.
toszcze
Byloby latwiej gdybys podal strukture tabel...
Domyslam sie, ze moze pomoc zalozenie indeksu (indeksow) na pola MOD i NR_KOD we wszystkich tabelach, ktore sa za pomoca tych pol w jakis sposob powiazane. Ale jak mowie - struktura tabel moglaby troche pomoc w optymalizacji.
Piccolo
Oto struktura tabel:

# Struktura tabeli dla `data`
#

CREATE TABLE data (
ID double NOT NULL default '0',
NR_RYS varchar(15) default NULL,
OPIS varchar(100) default NULL,
NR_POS varchar(5) default NULL,
QUANT varchar(5) default NULL,
NR_KOD varchar(5) default NULL,
ZM varchar(255) default NULL,
ZAST varchar(255) default NULL,
MOD varchar(5) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Struktura tabeli dla `tabele2`
#

CREATE TABLE tabele2 (
ID double NOT NULL default '0',
KOD_GR double default NULL,
NR_TAB varchar(10) default NULL,
NR_KOD varchar(5) default NULL,
NT varchar(80) default NULL,
IMG varchar(10) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Struktura tabeli dla `vehicle`
#

CREATE TABLE vehicle (
ID double NOT NULL default '0',
M varchar(5) default NULL,
MODEL varchar(80) default NULL,
MOD varchar(5) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
DeyV
prosiłbym jeszcze o jakiś plik z przykładowymi danymi, inaczej trudno się wypowiadać na temat normalizacji tej tabeli. (najlepiej w postaci załącznika, tj. tylko linku do pliku)
A co do pytania opartego o składnie JOIN - oto prost przykład tego zapytania:
  1. SELECT
  2. vehicle.*,
  3. tabele2.NR_TAB,
  4. tabele2.NT,
  5. DATA.NR_RYS,
  6. DATA.OPIS,
  7. DATA.NR_KOD
  8. FROM DATA LEFT JOIN tabele2 ON ( tabele2.NR_KOD = DATA.NR_KOD )
  9. LEFT JOIN vehicle ON ( DATA.MOD = vehicle.MOD )
  10. WHERE DATA.NR_RYS LIKE '%test%'
  11. ORDER BY DATA.NR_RYS, tabele2.NR_TAB, vehicle.MOD ASC
toszcze
Pierwsza rzecz, ktora rzucila mi sie w oczy - zmien typ pola ID (w kazdej z tabel) na INT. Uzycie DOUBLE jest tam zbedne - przeciez wartosci pola ID beda zawsze liczbami calkowitymi.

Po drugie - podtrzymuje swoja wypowiedz o koniecznosci zalozenia odpowiednich indeksow (wymienilem je w poprzednim poscie). Oczywiscie nie znam wszystkich relacji pomiedzy tabelami, wiec mozliwe, ze indeksy powinny rowniez zawierac inne pola, ale na potrzeby tego zapytania powinno to wystarczyc.
Piccolo
Dzięki DeyV, jesteś wielki, właśnie o coś takiego mi chodziło. Powiem Ci szczerze, że próbowałem na podobnej zasadzie, ale nie wiem dlaczego mi nie wychodziło. Chyba zadziałała zasada, że jak zrobi coś początkujący to nie działa, a zrobi to samo fachowiec - rusza od strzału. tongue.gif tongue.gif Mój kod na pierwszy rzut oka zyglądał identycznie, a jednak wywalał błąd.
Toszcze, relacje są jak najbardziej prawidłowe, ale dzięki za zainteresowanie i zwrócenie uwagi na ID, już zmieniam.
DeyV
Poza niezbędnymi indexami (wszystkie złączenia powinny być robione przy pomocy kolumn z indexami) warto by było doprowadzić do stanu, gdy można łączyć tabele tylko przy pomocy kolumn typu INT.
Tym bardziej że ich nazwy niejako same narzucają taki typ.
W przypadku gdy nie jest to możliwe - lepiej nawet zastosować klucz (sztuczny?? - jak to się nazywało...) aby uniknąć korzystania z varchar w takich przypadkach.
Piccolo
NR_KOD i MOD to kolumny, które zawierają oznaczenia narzucone mi przez bazę, którą otrzymałem w spadku po Accessowej bazie. Moim zadaniem było takie dopasowanie bazy internetowej, aby po jakiejkolwiek zmianie w Accessie można było bez problemu przekonwertować na "internet". Tabela "dane" zawiera 70 tys. rekordów, tabela tabele2 zawiera 4000 rekordów, a tabela "vehicle" tylko 20 rekordów. Wmieniać te wszystkie pola w tych trzech tabelach , przy założeniu, że się powtarzają i składaja się z liter i cyfr, to dla mnie trochę za dużo, a inna sprawa, że musiałbym to robić po każdej aktualizacji Accessa. Chyba zgodzisz się, że lepiej zrobić to na "varchar".
Pozdrowionka i dzięki DeyV
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.