Avatar billede hobz Nybegynder
07. maj 2003 - 23:19 Der er 29 kommentarer og
1 løsning

MySQL index

Hvad vil det sige når man index'er en column?
Avatar billede erikjacobsen Ekspert
07. maj 2003 - 23:25 #1
man gør søgninger med = (ikke med like) mere effektive
og så bruger man mere plads, og gør inserts dyrere
(kort fortalt...)
Avatar billede hobz Nybegynder
07. maj 2003 - 23:26 #2
Hvorfor bruger man mere plads?
Gør insert's dyrere?
Avatar billede tefcke Nybegynder
07. maj 2003 - 23:42 #3
fordi der bliver opbygget et søgetræ. Det fylder plads at opbevare, samt man ligeledes skal opdatere dette søgetræ, udover man også indsætter på normal vis, når der indsættes i databasen!
Avatar billede hobz Nybegynder
07. maj 2003 - 23:51 #4
Dvs. insert tager 'længere' tid?
Det er altså godt at bruge på ofte brugte columns (SELECT)?
Avatar billede erikjacobsen Ekspert
07. maj 2003 - 23:54 #5
Ja, hvis du tit søger på fx

  ...where livret='osteskorper'

så kan man overveje at indexere livret. Men det dur ikke til

  ...where livret like '%osteskorper%'
Avatar billede hobz Nybegynder
07. maj 2003 - 23:56 #6
Ahh.. men det er altså KUN møntet på
  ...where liveret != 'osteskorper' ?
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 00:34 #7
Nu valgte jeg osteskorper, fordi det næppe er manges livret.
For strengt taget giver det kun en forbedring hvis det
er et mindre antal tupler man skal returnere som svar.
Groft sagt igen: med et index behøver databasen stort
set kun kigge på de relevante tupler. Er det 5 ud af
et samlet antal på 100.000 kan du selv fornemmer forskellen.

Men skriver du så != vi den i ovenstående eksempel skulle
aflevere 99.995 tupler - stort set dem allesammen - og så
er der li'som ingen besparelse, kun ekstra besvær med at
indsætte og slette fra indexet. Det kan så formentlig ikke
betale sig.
Avatar billede hobz Nybegynder
08. maj 2003 - 10:07 #8
Så konklusionen er, at det kun kan betale sig at benytte index'ering når, man kan konstatere at hovedparten af ens SELECT's kun vil returnere et begrænset antal 'tupler' ?
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 10:11 #9
Ja. Men det er en kunst at vælge korrekt  -  eller er det en
videnskab? Dem der kan sådan noget som det her på fingerspidserne,
bliver højtlønnede databaseadministratorer i de store virksomheder... :)
Avatar billede hobz Nybegynder
08. maj 2003 - 10:14 #10
Hehe. Lyder som noget man burde øve sig i;)

Kan man forresten bruge SELECT's i default value?
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 10:30 #11
"default value" ?

Nå, ja, og så er det nok ikke lige MySql, men produkter som Oracle, der
har rigtig mange parametre, der kan justeres på.
Avatar billede hobz Nybegynder
08. maj 2003 - 10:52 #12
Ja i et field. En DATE ville jeg gerne kunne sætte default til nuværende dato.
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 10:54 #13
Du mener vel INSERT og UPDATE ? Du kan bruge MySqls funktion: now() til
at indsætte dags dato.
Avatar billede hobz Nybegynder
08. maj 2003 - 13:46 #14
Ja det er jeg klar over, men i selve default value'n når man creater en table?
Avatar billede hobz Nybegynder
08. maj 2003 - 17:30 #15
Vil index'ering iøvrigt have effekt på USING() ?
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 18:40 #16
Eksempel?
Avatar billede hobz Nybegynder
10. maj 2003 - 10:49 #17
SELECT SUM(IF(beloeb < 0, beloeb, 0)) AS udgifter,
FROM
    balance
INNER JOIN
    medarbejder USING(medarbejder_id)
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 10:59 #18
Nåh, ja, ved joins generelt vil der blive brugt indexer
hvis databaseserveren mener det kan betale sig. Så laver
du mange, bestemte, joins skal du overveje indexer på
samme måde som ved selects.
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 11:02 #19
I dit eksempel vil medarbejder.medarbejder_id sikkert
være primær nøgle (og dermed indexeret), og så er
balance.medarbejder_id en fremmednøgle, og bør være
indexeret. I nyeste mysql, med den rigtige tabel-
implementation nedenunder, vi mysql vist nok forlange
at den er indexeret, når man specificerer den som
fremmednøgle.
Avatar billede hobz Nybegynder
10. maj 2003 - 11:10 #20
Så fields benyttet til at samle relationer i en database bør være indexerede?
Avatar billede hobz Nybegynder
10. maj 2003 - 11:21 #21
Er der egentlig forskel på PRIMARY KEY og en selv defineret key?
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 12:25 #22
Ja til det første og nej til det andet - som udgangspunkt i hvert fald.
Avatar billede hobz Nybegynder
10. maj 2003 - 12:34 #23
Hvad er meningen med primary key?
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 12:38 #24
Det er et aikre at hver tupel (række) i tabellen med sikkerhed
har en unik identifikation, så du efterfølgende kan referere til
hver enkelt række. Der behøver ikke være en PK, men prøv
at tage sådan en tabel ind i phpmyadmin - så kan du
pludselig ikke redigere og slette enkelte rækker. fordi det
ikke længere giver mening.
Avatar billede hobz Nybegynder
10. maj 2003 - 12:41 #25
Okay, men altså ikke nødvendig hvis man selv definere sine uniques.

Tak for 'sludderen' :)
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 12:45 #26
Joh, nødvendig hvis du efterfølgende skal gøre noget fornuftigt
ved tabellen. Har du et andet felt, der har samme karakteristika
som en PK, så gør den da til PK.

Der kan da godt tænkes tilfælde hvor en PK kan undværes, måske.
Jeg kan nu ikke lige komme på én.... at MySql tillader, at man
ikke har en PK er en anden sag.
Avatar billede hobz Nybegynder
10. maj 2003 - 13:19 #27
Samme karakteristika vil sige, at den er unique ?
Avatar billede erikjacobsen Ekspert
10. maj 2003 - 13:34 #28
Jah, er det ikke bare unique og nut noll - hehe - not null.
Avatar billede hobz Nybegynder
10. maj 2003 - 13:45 #29
PK - sjofel programmering :P
Avatar billede hobz Nybegynder
13. maj 2003 - 13:01 #30
Ingen svar Erik?
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