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.
alternative zu WHERE x LIKE '%$y%'
Re: alternative zu WHERE x LIKE '%$y%'
wie wäre es mit Volltextsuche?
Re: alternative zu WHERE x LIKE '%$y%'
... oder vielleicht kann man die Tabellen noch ein wenig optimieren?
-
- Posts: 65
- Joined: 2003-01-30 22:46
Re: alternative zu WHERE x LIKE '%$y%'
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
bin mir im moment aber nicht mehr sicher was der ausschlaggebende grund war diese nicht zu verwenden
ich werde das nochmal versuchen
-
- Posts: 1117
- Joined: 2002-09-27 00:54
- Location: Hannover
- Contact:
Re: alternative zu WHERE x LIKE '%$y%'
Index auf die Spalte in der gesucht wird.
Alexander Newald
Alexander Newald
Re: alternative zu WHERE x LIKE '%$y%'
ein Index kann nicht für like '%suchwort%' verwendet werden!
Dafür sind B-Tree-Indices nicht geeignet..
siehe auch
Dafür sind B-Tree-Indices nicht geeignet..
siehe auch
Code: Select all
explain select-statement
Re: alternative zu WHERE x LIKE '%$y%'
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:
hth,
Paranoid
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
Paranoid