alternative zu WHERE x LIKE '%$y%'

MySQL, PostgreSQL, SQLite
debian inside
Posts: 65
Joined: 2003-01-30 22:46

alternative zu WHERE x LIKE '%$y%'

Post by debian inside » 2003-04-15 12:05

Ich hab meine Suchfunktionen immer mit WHERE x LIKE '%$y%' realisiert.
Nun steigt aber die Serverbelastung mit der Anzahl der Datensätze dramatisch.
Gibt es ne alternative?
Es soll einfach alle Datensätze finden die $y enthalten egal wo.

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: alternative zu WHERE x LIKE '%$y%'

Post by jtb » 2003-04-15 12:17

wie wäre es mit Volltextsuche?

bigmac
Posts: 103
Joined: 2002-04-24 11:36
Location: 35440, Linden

Re: alternative zu WHERE x LIKE '%$y%'

Post by bigmac » 2003-04-15 12:42

... oder vielleicht kann man die Tabellen noch ein wenig optimieren?

debian inside
Posts: 65
Joined: 2003-01-30 22:46

Re: alternative zu WHERE x LIKE '%$y%'

Post by debian inside » 2003-04-15 12:43

hab ich schon mal versucht
bin mir im moment aber nicht mehr sicher was der ausschlaggebende grund war diese nicht zu verwenden
ich werde das nochmal versuchen

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: alternative zu WHERE x LIKE '%$y%'

Post by alexander newald » 2003-04-15 12:45

Index auf die Spalte in der gesucht wird.

Alexander Newald

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: alternative zu WHERE x LIKE '%$y%'

Post by jtb » 2003-04-15 12:50

ein Index kann nicht für like '%suchwort%' verwendet werden!

Dafür sind B-Tree-Indices nicht geeignet..

siehe auch

Code: Select all

explain select-statement

paranoid
Posts: 14
Joined: 2003-04-27 21:48
Location: 67xxx

Re: alternative zu WHERE x LIKE '%$y%'

Post by paranoid » 2003-04-28 00:08

Du kannst dir selber Index-Tabellen definieren, phpBB macht es glaube ich auch so, evtl. kannst du dir ja mal den Quelltext und die DB-Struktur ansehen.

Das kann z.B. so aussehen, wenn du über die Spalte TEXT in folgender Tabelle TEXT suchen willst:

create table TEXT(
TEXT_ID int not null primary key,
TEXT text not null
);

create table WORT(
WORT_ID int not null primary key,
WORT varchar(32)
);

create clustered unique index WORT_IX1 on WORT(WORT);

create table REL_WORT_TEXT(
WORT_ID int not null,
TEXT_ID int not null
primary key (WORT_ID, TEXT_ID)
);



Wenn die Syntax nicht ganz korrekt ist, seht mir das bitte nach und korrigiert mich - ich arbeite normalerweise auf nem anderen DBS.

Wenn du die Tabellen WORT und REL_WORT_TEXT aktuell hälst (in WORT stehen alle Worte, die in der TEXT-Spalte vorkommen und in der REL-Tabelle speicherst du, welches Wort in welcher Zeile der Text-Tabelle vorkommt), kannst du schnell über den Index auf WORT die WORT_ID ermitteln und über die REL_WORT_TEXT die entsprechenden Texte ermitteln. Wichtig ist eben, daß du geeignete Indizes anlegst, grade bei WORT und REL_WORT_TEXT als Lookup-Tabellen solltest du clustered indizies verwenden.
Außerdem würde ich in WORT keine Groß-/Kleinschreibung berücksichtigen, sondern z.B. nur Kleinschreibung verwenden.

Beispiel-Query:

Code: Select all

select t.TEXT
  from TEXT t,
       WORT w,
       REL_WORT_TEXT r
 where w.WORT = lower('Beispiel')
   and w.WORT_ID = r.WORT_ID
   and r.TEXT_ID = t.TEXT_ID
hth,
Paranoid