/ 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
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

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

Månedens bedste
Årets bedste
Sidste års bedste