Avatar billede carstenandersen Nybegynder
02. oktober 2012 - 19:31 Der er 11 kommentarer og
1 løsning

Korrekt sql streng for at minimere forespørgsel i database

Hej eksperter

Jeg har en database med ca. 100.000 linier, hvorfor jeg selvfølgelig skal forsøge at lave forespørgslerne til databasen meget konkrete.

Hvis jeg kender det nøjagtige Id bruger jeg i dag:

SQL = "Select * from Sider where Id = '17245'"
....

Hvis jeg skal finde flere sider ud fra et kriterie, bruger jeg f.eks:

SQL = "Select * from Sider where Bruger = '300' ORDER BY Id"
...

Den sidste gennemløber alle 100.000 linier for at finde alle de sider, hvor brugeren er lig med 300. Mit spørgsmål er nu - gør den første ikke også dette? Hvis ja, hvordan skal det så skrives, så den kun tager netop linien med i id nr. 17245 og lader være med at gennemgøre de andre 99.999 linier.

Det er virkelig basis aps, men er virkelig blevet i tvivl om brugen af denne basis ;-)

På forhånd tak.
Avatar billede softspot Forsker
02. oktober 2012 - 19:44 #1
Hvormeget data der gennemsøges ved en forspørgsel afhænger af hvilke index der er oprettet på dine data.

Et opslag på tabellens id vil typisk betyder, at der er et unique index på kolonnen id og derfor er opslaget optimeret via indekset (indeks er ordnet således databasen hurtigt kan finde data i indekset og derfra slå direkte op i tabellen med data).

Hvis du vil optimere dit opslag på bruger, skal du altså også oprette et indeks på denne kolonne.
Avatar billede olebole Juniormester
02. oktober 2012 - 19:44 #2
<ole>

Databasen er jo i princippet nødt alle rækkerne igennem, indtil den ønskede række er fundet. Til gengæld kan du stoppe den yderligere søgen ved at sætte et LIMIT:

SQL = "Select * from Sider where Id = '17245' LIMIT 1"

Men et meget væsentligt spørgsmål er: Har du brug for alle felterne i hver række? Hvis du ikke har det, skal du ikke bruge * - men en kommasepareret liste af felter:

SQL = "Select f_name, s_name, birthday from Sider where Id = '17245' LIMIT 1"

Derudover kan du lette søgningen væsentligt ved at indeksere dine tabeller

/mvh
</bole>
Avatar billede carstenandersen Nybegynder
02. oktober 2012 - 20:04 #3
Fedt med jeres svar :-)

Min Id-tabel er sat op med AUTO_INCREMENT og Primary:

Handling    Nøglenavn    Datatype    Unik    Packed    Feltnavn    Kardinalitet    Kollation (Collation)    Nulværdi    Comment
        PRIMARY    BTREE    Ja    Nej    Id    24549    A

Skal der gøres mere?

olebole, den med LIMIT 1 skal selvfølgelig med, er med til at begrænse, super :-)
Avatar billede erikjacobsen Ekspert
02. oktober 2012 - 20:11 #4
Hvis id-feltet er en primær nøgle, gør det så en reel forskel at sætte LIMIT 1 på?  (Nej, Ole, ingen præmie denne gang)
Avatar billede softspot Forsker
02. oktober 2012 - 20:19 #5
Jeg ville synes var tåbeligt, hvis det havde nogen betydning med LIMIT 1 :-)
Avatar billede softspot Forsker
02. oktober 2012 - 20:23 #6
...men nu forelå der jo heller ingen information omkring primary key forhold inden oles svar, så det var nok derfor LIMIT 1 er medtager :-)

Hvilken database server er der tale om?
Avatar billede carstenandersen Nybegynder
02. oktober 2012 - 20:25 #7
mysql
Avatar billede olebole Juniormester
02. oktober 2012 - 20:47 #8
@Erik: Din bælgøjede tumlen rundt er som altid rigelig præmiering i sig selv  *o)

Som softspot anfører, forelå der først informationer om evt. primaries 20 minutter efter min kommentar  =)
Avatar billede erikjacobsen Ekspert
02. oktober 2012 - 20:53 #9
Som man siger: "Blind høne går sulten i seng" - der forelå heller ingen oplysninger, der kunne indikere at spørgeren kun havde brug for een række.

Men til spørgeren: Når id er en primær nøgle, er LIMIT 1 ganske overflødig. SQL-maskinen ve' godt at der maks er gevinst een gang.
Avatar billede carstenandersen Nybegynder
02. oktober 2012 - 21:33 #10
Tusind tak for jeres svar. Smid alle et svar.
Avatar billede softspot Forsker
02. oktober 2012 - 21:59 #11
:-)
Avatar billede olebole Juniormester
02. oktober 2012 - 22:40 #12
"der forelå heller ingen oplysninger, der kunne indikere at spørgeren kun havde brug for een række."

Nej, det kan du sige ... ikke ud over dem i spørgsmålsteksten i hvertfald  =)

Erik og jeg samler ikke point, så de må være softspot's ... ellers tak  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester