Avatar billede supermand69 Nybegynder
20. oktober 2004 - 14:15 Der er 19 kommentarer og
2 løsninger

Korrekt indeksering?

Jeg står og er lidt i tvivl om hvordan man indekserer sine tables korrekt?

Index:
Laver en "separat" indeksering.

Unique:
Laver en "separat" indeksering, og det pågældende felt må ikke optræde flere gange med den samme værdi.

Primary:
Virker på samme måde som Unique, blot at felterne laver en "fælles" nøgle som ikke må optræde flere gange.

Har jeg ret? Eller er der mere at tilføje? :)
Avatar billede arne_v Ekspert
20. oktober 2004 - 14:43 #1
Næsten.

Jeg mener også at du kan lave almindelige indexer på flere felter.
Avatar billede arne_v Ekspert
20. oktober 2004 - 14:43 #2
(altså det er ike kun primær nøgle som kan have index på flerefelter)
Avatar billede majkat Nybegynder
20. oktober 2004 - 15:29 #3
Både INDEX, UNIQUE og PRIMARY kan indeholde flere felter - og det er så (for UNIQUE og PRIMARY) *kombinationen* af felter som ikke må optræde flere gange.

Forskelle mellem UNIQUE og PRIMARY:
- UNIQUE kan indeksere kolonner med NULL; det kan PRIMARY KEY ikke.
- Du må kun have een PRIMARY - dette er i henhold til SQL standarden. Du må have lige så mange UNIQUE som du vil.

PRIMARY er altså (bortset fra navne-restriktionen) en UNIQUE på en NOT NULL kolonne. Faktisk vil MySQL automatisk sætte det første UNIQUE/NOT NULL index til at være PRIMARY hvis der ikke allerede er defineret en sådan
Avatar billede majkat Nybegynder
20. oktober 2004 - 15:32 #4
Bemærk i øvright at MySQL kun kan bruge et indeks hvis *starten* af indekset kan bruges i søgningen. F.eks, kan et indeks på kombinationen (A, B, C) bruges til at lave søgniner på (A, B, C), (A, B) og (A)  -- men ikke f.eks. (B), (C) og (B, C)
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 19:00 #5
arne >
Jeg er ikke helt med? Altså man kan godt sætte INDEX og UNIQUE på mere end et felt?

majkat >
"Du må kun have een PRIMARY - dette er i henhold til SQL standarden"
Jamen alle felter man sætter til PRIMARY bliver jo sådan set til en fælles nøgle?
Avatar billede arne_v Ekspert
20. oktober 2004 - 19:02 #6
Du kan godt have et INDEX bestående af flere felter ligesom du kan have en PRIMARY KEY
bestående af flere felter.

Du kan kun have en PRIMARY KEY.
Avatar billede arne_v Ekspert
20. oktober 2004 - 19:06 #7
Eksempel:

CREATE TABLE t (
  a INTEGER,
  b INTEGER,
  c INTEGER,
  d INTEGER,
  PRIMARY KEY(a,b)
);
CREATE INDEX ix ON t (c,d);
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 19:38 #8
nå, på den måde :)

men hvad er forskellen så på de to slags??
Avatar billede arne_v Ekspert
20. oktober 2004 - 19:42 #9
Der kan kun være en PRIMARY KEY. Der kan være mange INDEX. PRIMARY KEY er
altid UNIQUE. PRIMARY KEY skal være der (i nogen databaser). Kort sagt: PRIMARY KEY er
noget helt specielt.
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 19:46 #10
ok, men jeg er bare stadig ikke helt sikker på hvad et sammensat INDEX er? hvad er forskellen på at lave enkelte nøgler med INDEX og så lave sammensatte? der er vel ikke rigtig nogen forskel?
Avatar billede arne_v Ekspert
20. oktober 2004 - 19:51 #11
Umiddelbart vil jeg sige at man kun bruger et index på mere end et felt, hvis
dataene gør at som oftest vil have en kombineret test på dem
(WHERE felt1=X AND felt2=Y) i sine queries.

PRIMARY KEY på mere end et felt kan være nødvendigt for at få noget unikt. Men
jeg vil næsten altid foretrække at smække et ekstra autogenereret id felt på
i stedet for.
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 20:15 #12
ok... tak for hjælpen :)

majkat & arne >
lav et svar
Avatar billede arne_v Ekspert
20. oktober 2004 - 20:16 #13
mit
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 20:18 #14
Lige en ting mere? Hvornår kan det svare sig at lave indeksering på en table? Tænker her på >x antal rækker
Avatar billede arne_v Ekspert
20. oktober 2004 - 20:21 #15
Det væsentligste kriterie for om et felt skal have et index må være om det
bruges til join eller where betingelse i queries.

Der er selvfølgelig mest nytte af index ved mange rækker.
Avatar billede supermand69 Nybegynder
20. oktober 2004 - 20:27 #16
arne >
ehm...? så må du hellere lige komme med en forklaring til dette: "Det væsentligste kriterie for om et felt skal have et index må være om det
bruges til join eller where betingelse i queries"

Hvor mange rækker skal der så til før det er bevendt? Jeg har tabeller med under 200-300 rækker? Kan det svare sig med indeksering her? :)
Avatar billede arne_v Ekspert
20. oktober 2004 - 20:33 #17
Hvis du har en query:

SELECT a,b,c,d,e,f,g,h,i,j FROM t_1 JOIN T_2 ON t_1.a=t_2.f WHERE t_2.j=brugerinput

Så er det oplagt at putte index på t_1.a, t_2.f og t_2.j
Avatar billede arne_v Ekspert
20. oktober 2004 - 20:34 #18
Nytten ved index på under 200 rækker er nok lille. Mne jeg ville sætte dem på
alligevel. Lidt har også ret. Og måske komme rder en dag flere rækker i.
Avatar billede majkat Nybegynder
21. oktober 2004 - 09:40 #19
mit
Avatar billede majkat Nybegynder
21. oktober 2004 - 09:43 #20
mht få rækker -- der er stor sansynlighed for at MySQL simpelt hen ignorerer indexes for tabeller med få rækker - det er hurtigere bare at indlæse tabellen frem for først indekset, så tabellen.

Så i værste fald har du spildt en lille smule diskplads...
Avatar billede supermand69 Nybegynder
21. oktober 2004 - 16:21 #21
Nå, men tak for hjælpen begge to :)
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
Computerworld tilbyder specialiserede kurser i database-management

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