Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak przyspieszyć ten kod?
Piccolo
post 22.09.2004, 12:27:30
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
toszcze
post 22.09.2004, 12:48:20
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.


--------------------
WebHelp.pl
Go to the top of the page
+Quote Post
Piccolo
post 22.09.2004, 14:05:45
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 22.09.2004, 14:37:21
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


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
toszcze
post 22.09.2004, 16:12:33
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.


--------------------
WebHelp.pl
Go to the top of the page
+Quote Post
Piccolo
post 23.09.2004, 06:07:29
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. 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.
Go to the top of the page
+Quote Post
DeyV
post 23.09.2004, 10:47:44
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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Piccolo
post 23.09.2004, 13:08:32
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:13