|
| WHERE Titel like "D%" Fra : Harald |
Dato : 25-02-07 19:42 |
|
Bruger MySQL 4.0
Jeg skal vælge alle titler i en tabel hvor 1. bogstav er f.eks. D
SELECT * FROM tabel WHERE Titel LIKE "D%" LIMIT 200
Er det den bedste/hurtigeste måde at gøre dette på?
/HK
| |
Thorbjørn Ravn Ander~ (25-02-2007)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 25-02-07 21:19 |
|
"Harald" <nomail@noname.dk> writes:
> Bruger MySQL 4.0
> Jeg skal vælge alle titler i en tabel hvor 1. bogstav er f.eks. D
>
> SELECT * FROM tabel WHERE Titel LIKE "D%" LIMIT 200
>
> Er det den bedste/hurtigeste måde at gøre dette på?
Definitionssag. Så vidt jeg ved bruger LIKE en fulltablescan, og hvis
det er fint med dig, så er det jo fint :)
Hvis du gør det 100 gange i minuttet var det måske en ide at lave en
ekstra tabel med dine søgetermer og så linkende til den faktiske
række.
OG indeksere denne grundigt.
--
Thorbjørn Ravn Andersen
| |
Peter Lykkegaard (26-02-2007)
| Kommentar Fra : Peter Lykkegaard |
Dato : 26-02-07 21:53 |
|
"Thorbjørn Ravn Andersen" wrote:
>
> Definitionssag. Så vidt jeg ved bruger LIKE en fulltablescan, og hvis
> det er fint med dig, så er det jo fint :)
>
Kun hvis det er noget ala: WHERE Titel like "%D%"
- Peter
--
Hi! I'm a .signature *virus*!
Copy me into your ~/.signature to help me spread!
| |
Jonas Delfs (25-02-2007)
| Kommentar Fra : Jonas Delfs |
Dato : 25-02-07 23:27 |
|
Harald skrev:
> Bruger MySQL 4.0
> Jeg skal vælge alle titler i en tabel hvor 1. bogstav er f.eks. D
>
> SELECT * FROM tabel WHERE Titel LIKE "D%" LIMIT 200
>
> Er det den bedste/hurtigeste måde at gøre dette på?
Det er da i hvert fald logisk en meget let måde at gøre det på, men
wildcards er generelt noget tunge, så måske WHERE LEFT(Titel,1)='D' vil
udføres hurtigere... men hvorfor ikke lade det komme an på en prøve?
Hvis du bruger wildcard-løsningen så husk at indexere 'Titel'.
Mvh. Jonas
| |
Peter Brodersen (26-02-2007)
| Kommentar Fra : Peter Brodersen |
Dato : 26-02-07 00:14 |
|
On Sun, 25 Feb 2007 23:26:47 +0100, Jonas Delfs <jonas@delfs.dk>
wrote:
>Det er da i hvert fald logisk en meget let måde at gøre det på, men
>wildcards er generelt noget tunge, så måske WHERE LEFT(Titel,1)='D' vil
>udføres hurtigere... men hvorfor ikke lade det komme an på en prøve?
>Hvis du bruger wildcard-løsningen så husk at indexere 'Titel'.
Nej, MySQL benytter ikke indexes, hvis man bruger feltet i en
funktion. Derimod kan MySQL godt finde ud af at bruge et index ved
LIKE (naturligvis forudsat at begyndelsen af strengen er kendt).
LEFT(Titel,1) = 'D'
vil lave et fuldt table scan.
Titel LIKE "D%"
vil benytte sig af indexet.
Dette fremgår blandt andet af EXPLAIN.
Opsummeret: Brug LIKE og hold dig fra LEFT().
--
- Peter Brodersen
Kendt fra Internet
| |
Jonas Delfs (26-02-2007)
| Kommentar Fra : Jonas Delfs |
Dato : 26-02-07 13:14 |
|
Peter Brodersen skrev:
> On Sun, 25 Feb 2007 23:26:47 +0100, Jonas Delfs <jonas@delfs.dk>
> wrote:
>
>> Det er da i hvert fald logisk en meget let måde at gøre det på, men
>> wildcards er generelt noget tunge, så måske WHERE LEFT(Titel,1)='D' vil
>> udføres hurtigere... men hvorfor ikke lade det komme an på en prøve?
>> Hvis du bruger wildcard-løsningen så husk at indexere 'Titel'.
> MySQL benytter ikke indexes, hvis man bruger feltet i en
> funktion. Derimod kan MySQL godt finde ud af at bruge et index ved
> LIKE (naturligvis forudsat at begyndelsen af strengen er kendt).
Det lyder jo som om vi er enige:)
> Dette fremgår blandt andet af EXPLAIN.
>
> Opsummeret: Brug LIKE og hold dig fra LEFT().
Ok. Jeg har ikke nogen praktiske erfaringer der fortæller noget om
hastighedsforskellene ved de to, så det var blot et andet
løsningsforslag og en opfordring til at prøve begge dele af.
Mvh. Jonas
| |
Harald (26-02-2007)
| Kommentar Fra : Harald |
Dato : 26-02-07 00:18 |
|
"Jonas Delfs" <jonas@delfs.dk> skrev i en meddelelse
news:45e20d2a$0$90271$14726298@news.sunsite.dk...
> Harald skrev:
>> Bruger MySQL 4.0
>> Jeg skal vælge alle titler i en tabel hvor 1. bogstav er f.eks. D
>>
>> SELECT * FROM tabel WHERE Titel LIKE "D%" LIMIT 200
>>
>> Er det den bedste/hurtigeste måde at gøre dette på?
>
> Det er da i hvert fald logisk en meget let måde at gøre det på, men
> wildcards er generelt noget tunge, så måske WHERE LEFT(Titel,1)='D' vil
> udføres hurtigere... men hvorfor ikke lade det komme an på en prøve?
> Hvis du bruger wildcard-løsningen så husk at indexere 'Titel'.
Jeg har kun ca. 20000 poster i min tabel indtil nu og det er ikke nok til at
jeg kan måle nogen forskel, men jeg vil prøve med LEFT() indtil videre.
Takker
/HK
| |
Harald (26-02-2007)
| Kommentar Fra : Harald |
Dato : 26-02-07 00:19 |
|
"Harald" <nomail@noname.dk> skrev i en meddelelse
news:45e21916$0$15872$edfadb0f@dtext01.news.tele.dk...
> "Jonas Delfs" <jonas@delfs.dk> skrev i en meddelelse
> news:45e20d2a$0$90271$14726298@news.sunsite.dk...
>> Harald skrev:
>>> Bruger MySQL 4.0
>>> Jeg skal vælge alle titler i en tabel hvor 1. bogstav er f.eks. D
>>>
>>> SELECT * FROM tabel WHERE Titel LIKE "D%" LIMIT 200
>>>
>>> Er det den bedste/hurtigeste måde at gøre dette på?
>>
>> Det er da i hvert fald logisk en meget let måde at gøre det på, men
>> wildcards er generelt noget tunge, så måske WHERE LEFT(Titel,1)='D' vil
>> udføres hurtigere... men hvorfor ikke lade det komme an på en prøve?
>> Hvis du bruger wildcard-løsningen så husk at indexere 'Titel'.
>
> Jeg har kun ca. 20000 poster i min tabel indtil nu og det er ikke nok til
> at jeg kan måle nogen forskel, men jeg vil prøve med LEFT() indtil videre.
Ok, jeg vil så benytte LIKE efter at have læst Peter´s post.
/HK
| |
Thorbjørn Ravn Ander~ (26-02-2007)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 26-02-07 02:12 |
|
"Harald" <nomail@noname.dk> writes:
> Jeg har kun ca. 20000 poster i min tabel indtil nu og det er ikke nok til at
> jeg kan måle nogen forskel, men jeg vil prøve med LEFT() indtil videre.
I så fald så spørg databasen hvad den laver. Peter skrev EXPLAIN
virkede - kig på den - hvis den begynder at snakke om full-table-scans
har du en løsning der skalerer dårligt.
Jeg går naturligvis ud fra at du har testdata "nok" til at den ikke
synes det er sværerere at slå op gennem indeks end at lave et
full-table-scan. Det er en af de ting man kan blive snydt med med Oracle.
--
Thorbjørn Ravn Andersen
| |
|
|