Avatar billede htx98i17 Professor
27. december 2008 - 19:45 Der er 14 kommentarer og
1 løsning

Add index forskelle

er der nogen performance forskel på at tilføje index på een column eller to columns ad gangen?

altså
ALTER TABLE `table` ADD INDEX ( `type` )
vs
ALTER TABLE `table` ADD INDEX ( `forumtopostid` , `forumpostid` )
Avatar billede arne_v Ekspert
27. december 2008 - 19:51 #1
Der er stort forskel.

Et index på (F1) og et index på (F2) gør:

... WHERE F1=X

og

... WHERE F2=Y

hurtigere

mens et index på (F1,F2) gør:

... WHERE F1=X AND F2=Y

hurtigere - muligvis vil

... WHERE F1=X

også blive hurtigere men

... WHERE F2=Y

vil ikke blive hurtigere.

Så du skal vælge enkelt eller dobbelt udfra hvad du skal bruge - benærk at det er validt
at lave index på både (F1), (F2) og (F1,F2) !
Avatar billede htx98i17 Professor
27. december 2008 - 19:55 #2
hvor var det godt jeg spurgte, jeg tror jeg forstår det.
vil muligvis poste et eksempel senere og spørge om det er rigtigt lavet

lig et svar :)
Avatar billede htx98i17 Professor
27. december 2008 - 20:00 #3
så lige et tillægsspm:

hvis man creater table og bruger INDEX på et felt, ser koden sådan ud: KEY `felt` (`felt`)
men hvis ALTER, så ser det sådan ud: ADD INDEX (`felt`)

altså ADD INDEX / KEY, Hvorfor?
Avatar billede arne_v Ekspert
27. december 2008 - 20:06 #4
INDEX og KEY er synonymer i MySQL

Det er ikke:

KEY feltnavn (feltnavn)

men:

KEY indexnavn (feltnavn)

Og jeg bruger altid:

CREATE TABLE ...
CREATE INDEX indexnavn ON tabelnavn(feltnavn)
Avatar billede htx98i17 Professor
27. december 2008 - 20:13 #5
super

tillægsspm nr 2:
Hvis man laver et index på (F1,F2)

og kalder med
WHERE (F2=y AND F1=x)

fungerer det så stadig som det skal, selv om man ikke kalder med
WHERE (F1=x AND F2=y)
Avatar billede arne_v Ekspert
27. december 2008 - 20:18 #6
Jeg vil tro at det stadig virker - ellers er den optimizer da den dummest optimizer
jeg længe har set.

Men du kan vel teste med EXPLAIN kommandoen !!
Avatar billede arne_v Ekspert
27. december 2008 - 20:19 #7
Og et svar
Avatar billede htx98i17 Professor
27. december 2008 - 20:23 #8
tak for deltagelsen
Avatar billede arne_v Ekspert
27. december 2008 - 20:30 #9
Hvis du er seriøs omkring din MySQL database og indexes, så er det en meget god ide
at lære at læse EXPLAIN output og checke sine queries med den.
Avatar billede htx98i17 Professor
27. december 2008 - 20:37 #10
lige et tillægsspm

hvis jeg adder index:
(F1,F2)
(F1,F3)

så advarer phpmyadmin fordi der er to index på samme felt

Gør det noget?
Avatar billede arne_v Ekspert
27. december 2008 - 20:42 #11
Ikke så vidt jeg ved.

Generelt vil jeg anbefale brug af enkelt felts index.

Normalt er det bedst til ON og WHERE betingelser.

Multi felts index er mest til UNIQUE INDEX og til foreign keys til tabel med
multi felt primary key.
Avatar billede htx98i17 Professor
27. december 2008 - 20:45 #12
"Multi felts index er mest til UNIQUE INDEX og til foreign keys til tabel med
multi felt primary key"

det kan du garantere ikke oversætte til forståeligt dansk :)

jeg tror nu alligevel jeg vil forsøge mig med multi felts index og så komme med ekspempler her som du kan se. Og så kan jeg altid lave det om hvis det ikke fungerer.
Avatar billede arne_v Ekspert
27. december 2008 - 21:15 #13
Et UNIQUE INDEX er et index som ikke tillader duplikater. Ligesom PRIMARY KEY.

Et eksempel på et multi felt unique index kunne være:

reservation:
  id - primary key, auto increment
  dato
  genstandid

ved at sætte et unique index på (dato,genstandid) forhindrer man dobbelt bookning
helt nede på database niveau.

En foreign key er et eller flere felter som peger på en primary key i en anden tabel.
Avatar billede htx98i17 Professor
27. december 2008 - 21:27 #14
vil det være en fordel at lave:
id - UNIQUE INDEX auto increment

på en column der ellers ser således ud:
id - primary key, auto increment

hvis sql'en er noget ala
SELECT tabel.felt FROM tabel JOIN tabel2 ON tabel2.foreign_key = tabel.id
Avatar billede arne_v Ekspert
27. december 2008 - 21:34 #15
Nej. En primær nøgle er et unikt index med lidt ekstra. Alle tabeller bør/skal have en
primær nøgle.
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