/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL: Tabel performance optimering
Fra : jonas@delfs.dk


Dato : 12-07-06 11:36

Hej gruppe

Jeg bøvler med ekstremt lange svartider på relativt simple
forespørgelser i en MySQL tabel.
Fx. tager forespørgsler som følgende gerne mellem 10 og 20 sekunder:

SELECT DISTINCT c . *
FROM <table> c
WHERE 1 && c.first_name LIKE '%ku%' && c.last_name LIKE '%n%'
ORDER BY <primary_key>

Der er omtrent 140k rækker i tabellen (og "rigtig mange" felter, hvis
det har noget at sige?), og så godt som hvert eneste felt er
indekseret. Jeg har desuden oprettet et kombineret index på first_name
og last_name for at se om det ville hjælpe mig ud - uden held.

Hvis jeg beder om en EXPLAIN på ovenstående SQL, får jeg:

id |     select_type |    table |    type |    possible_keys |    key |
key_len |    ref     rows |    Extra |
1 |   SIMPLE    c |   ALL |   NULL |   NULL |   NULL |   NULL |   144215 |   Using where;
Using temporary; Using filesort |

Det ser altså ud som om den ikke "fanger" mine indexes - hvad gør jeg
forkert?
Eller ligger problemet muligvis i stedet for eller også et andet sted?

På forhånd tak!

Mvh. Jonas


 
 
Peter Brodersen (12-07-2006)
Kommentar
Fra : Peter Brodersen


Dato : 12-07-06 13:04

On 12 Jul 2006 03:36:14 -0700, jonas@delfs.dk wrote:

>SELECT DISTINCT c . *
>FROM <table> c
>WHERE 1 && c.first_name LIKE '%ku%' && c.last_name LIKE '%n%'
>ORDER BY <primary_key>

Der kan ikke benyttes et index, når du søger efter fx %ku%.

Et index er typisk blot en på forhånd sorteret liste over et eller
flere felter. Hvis du sammenligner med en telefonbog, så er det let at
finde "Brodersen, Peter", men det er umuligt at finde alle dem, hvor
"ku" indgår, uden at kigge alle rækker igennem.

Derimod ville du godt kunne finde dem, der fx begynder med "ku". Her
vil indexet blive taget i brug.

--
- Peter Brodersen
Ugens^WMånedens^WSommerens værktøj - Find vej: www.findvej.dk
Nu med link direkte til en adresse, fx: www.findvej.dk/Nybrogade2,1203

jonas@delfs.dk (12-07-2006)
Kommentar
Fra : jonas@delfs.dk


Dato : 12-07-06 13:54

Peter Brodersen wrote:
> On 12 Jul 2006 03:36:14 -0700, jonas@delfs.dk wrote:
>
> >SELECT DISTINCT c . *
> >FROM <table> c
> >WHERE 1 && c.first_name LIKE '%ku%' && c.last_name LIKE '%n%'
> >ORDER BY <primary_key>
>
> Der kan ikke benyttes et index, når du søger efter fx %ku%.
>
> Et index er typisk blot en på forhånd sorteret liste over et eller
> flere felter. Hvis du sammenligner med en telefonbog, så er det let at
> finde "Brodersen, Peter", men det er umuligt at finde alle dem, hvor
> "ku" indgår, uden at kigge alle rækker igennem.
>
> Derimod ville du godt kunne finde dem, der fx begynder med "ku". Her
> vil indexet blive taget i brug.

Hej Peter

Ahh - så lærte jeg også noget nyt i dag. Ser ud til at 'ku%' giver
resultat ret hurtigt...
Hvad kan man gøre for at optimere performance ved fritekst-søgninger
som den jeg prøver at foretage?

- tak for svar!

Mvh. Jonas


Peter Brodersen (12-07-2006)
Kommentar
Fra : Peter Brodersen


Dato : 12-07-06 14:27

On 12 Jul 2006 05:53:54 -0700, jonas@delfs.dk wrote:

>Hvad kan man gøre for at optimere performance ved fritekst-søgninger
>som den jeg prøver at foretage?
>
>- tak for svar!

Ikke det store, hvis man skal kunne søge på dele inde i ord.

Hvis du har rigtigt, rigtigt meget tekst, så kan du overveje at kigge
på FULLTEXT-indekseringen, men det hjælper dig næppe i den givne
situation.

--
- Peter Brodersen
Ugens^WMånedens^WSommerens værktøj - Find vej: www.findvej.dk
Nu med link direkte til en adresse, fx: www.findvej.dk/Nybrogade2,1203

Thorbjørn Ravn Ander~ (12-07-2006)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 12-07-06 14:44

jonas@delfs.dk writes:

> Hvad kan man gøre for at optimere performance ved fritekst-søgninger
> som den jeg prøver at foretage?

Lave en tabel med ord? Lade Google om det?
--
Thorbjørn Ravn Andersen


Andreas Plesner Jaco~ (13-07-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 13-07-06 09:49

On 2006-07-12, Thorbjørn Ravn Andersen <nospam0000@gmail.com> wrote:
>
>> Hvad kan man gøre for at optimere performance ved fritekst-søgninger
>> som den jeg prøver at foretage?
>
> Lave en tabel med ord? Lade Google om det?

Eller et specialiseret værktøj såsom Apache Lucene.

--
Andreas

jonas@delfs.dk (14-07-2006)
Kommentar
Fra : jonas@delfs.dk


Dato : 14-07-06 08:44

Thorbjørn Ravn Andersen wrote:
> jonas@delfs.dk writes:
>
> > Hvad kan man gøre for at optimere performance ved fritekst-søgninger
> > som den jeg prøver at foretage?
>
> Lave en tabel med ord? Lade Google om det?

En tabel med ord er desværre ikke en løsningsmulighed. Google heller
ikke da det er et internt system.

Takker for svar til alle. Jeg har tilføjet valg af søge-operator
(default '=') så man kun bruger den langsomme LIKE '%%' hvis man
eksplicit vælger det.

Mvh. Jonas


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste