On Tue, 6 Dec 2005 18:00:25 +0100, "news.cybercity.dk" <Daniel Overby>
wrote:
>Det felt, jeg vil have fri-søgning på er en binary varchar(255). Jeg har
>lavet et alm. index på kolonnen, hvilket forbedrede ydelsen betragteligt.
>Jeg vil tro at der i snit er omkring 10.000 tupler i tabellen.
Det forbedrer det i hvert fald, hvis det er det præcise indhold (eller
begyndelsen af teksten vha. LIKE), der søges på.
Hvis der ikke er nogen grund til at feltet er binary, kan du jo
overveje at ændre det. En anden mulighed er at sætte en collation
on-the-fly i selve forespørgslen, vha. COLLATE:
http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
Rent semantisk mener jeg at det er pænere end at bruge UPPER.
>> Fulltext-indeksering kan ikke benyttes på blob-felter, men godt på
>> varchar-kolonner som dit (og char- og text-kolonner), også selv om de
>> er angivet som binary (= med binary collation).
>Kan det betale sig at bruge fulltext-indeksering? I run-time har jeg kun
>selects på tabellen - mine update, insert og delete kører i daglige batch
>jobs.
Det er lidt smag og behag.
I mine øjne er bl.a. søgninger på websider irregulære operationer, der
specielt i forbindelse med websider godt må tillade at være lidt
sløvere for bedre resultater.
Her kan det være, at man er interesseret i at søge i delmængder af ord
i teksten, hvor LIKE-søgninger på %søgeord% rent faktisk er at
foretrække frem for fuldtekst-indekseringer. Omvendt set kan
fuldtekst-indekseringer give en logisk fleksibilitet med flere
søgeord, vægt af resultater, m.m.
Det kan godt tænkes, at operationstiden fx stiger fra 0.01 sekund til
0.1 sekund ved LIKE-opslag, hvilket proportionelt kan virke voldsomt,
men i forbindelse med webresultater er det ikke nødvendigvis noget,
brugeren lægger mærke til. Igen, lige præcis ved søgninger har jeg det
fint med at applikationen bruger lidt ekstra energi på at levere
fornuftige resultater.
En detalje er selvfølgelig, at LIKE-søgningerne ikke skalerer så godt,
men at belastningen stiger lineært med mængden af indhold i kolonnen.
Det er så et spørgsmål om man får store mængder ny data ind, og om ens
database-server i øvrigt har sved på panden. I et andet projekt laver
jeg nogle ganske ressourcekrævende operationer i forbindelse med
søgninger (blandt andet tekstsammenligninger uden for databasen med
similar_text() i PHP). Det kræver langt flere ressourcer, men
resultatet er tilsvarende langt bedre - og den mængde ressourcer, der
kræves, er i øjeblikket godt inden for hvad jeg finder acceptabelt.
Hvis det dog skal være et pænt setup, der skalerer i det uendelige, så
er fulltext-indeksering det rette valg. Jeg forudsætter her, at der
skal kunne søges på bestemte ord inde i felterne, og ikke blot
begyndelsen af felterne (hvor et almindeligt indeks er fint nok).
En anden detalje er, at du i det setup helt sikkert bør sikre dig, at
du har querycachen aktiveret (hvis du minimum bruger MySQL 4.0). Det
er meget optimalt, idet du har "sjældne"
datamanipulations-operationer.
--
- Peter Brodersen