Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak przyspieszyć ten kod?
Piccolo
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 17.09.2004
Skąd: Brzeszcze

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
toszcze
post
Post #2





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 18.12.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Piccolo
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 17.09.2004
Skąd: Brzeszcze

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
DeyV
post
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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
Go to the top of the page
+Quote Post
toszcze
post
Post #5





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 18.12.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Piccolo
post
Post #6





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 17.09.2004
Skąd: Brzeszcze

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
DeyV
post
Post #7





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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.
Go to the top of the page
+Quote Post
Piccolo
post
Post #8





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 17.09.2004
Skąd: Brzeszcze

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 22:56