Datorn iFokus

Datorn

Etikettövrigt
Läst 1737 ggr
johan
0

Databasindex

Jag har en fråga om vilka index som ger bäst prestande i en databastabell. Här kommer funderingen:

Jag har en tabell där jag dels vill filtrera på vissa fält, och vissa andra fält som jag oftast kommer sortera på. T ex så vill jag oftast filtrera på användar-id och/eller sajt-id. Sorteringen vill jag antingen göra på datum eller användarnamn.

Är det bäst att i detta fall ha fyra index? Två index för filtreringen och två index för de olika sorteringarna?

Hur ska jag tänka för optimal prestanda?

Mvh // Johan

charlie
0
#1

Vilken databas pratar vi om?

---

johan
0
#2

SQL Server 2000

Mvh // Johan

mans
0
#3

Jag skulle vilja veta samma sak, fast jag sitter i MySQL. Är det nån stor skillnad?

charlie
0
#4

#3 stora skillnaden är väl att man kan hinta DBMS:en om hur tabellen kommer att användas, dvs vilken Engine det är som ska ta hand om den.

Motsvarigheten hos SQL Server skulle vara fill factor på ett index.

Dock så skiljer det sig åt syntaxmässigt dock.

För SQL Server så är det ganska så viktigt att det index man använder mest är 'clustered', eftersom detta kommer ligga inlineat i tabellen, det finns alltså behövs ingen extra dereferering från ett leef i indexträdet.

Om man filtrerar på två stycken kolumner samtidigt så bör oxo indexet utgöras av bägge kolumner. Likså ifall man sorterar på två fält samtidigt så ska dessa fält ingå i indexet.

 
Man kanske bör tillägga att ifall man sätter ett index på en nyckel (eller unique) så kan datbasservern tillgodogöra sig den informationen i att den inte kommer att finna duplikat.

---

Erik
0
#5

Kan också passa på att påpeka att det finns en risk att indexen ger problem om man har för många. Frågeoptimeringen blir nämligen mer komplicerad då den i första hand försöker utnyttja existerande index för att snabba upp sökningen.

Finns exempel på databaser som blivit obrukbara på grund av för många index (giftcentralens gamla databas bl.a, har jag hört). Att ställa frågor mot databasen tog runt 10 sekunder. Lite dryga 99% av tiden gick åt till frågeoptimering, medans själva databasfrågan gick hur snabbt som helst.

Lösningen blev att normalisera databasen och ta bort alla index. =P

mans
0
#6

Jag brukar mest skapa ett index per tabell med alla fält jag kan tänkas vilja filtrera eller sortera på. Det är alltså inte särskilt optimalt egentligen?

Jag skulle verkligen behöva gå en riktigt bra MySQL-kurs, typ på en eller två dagar. Har inte hittat nån som ligger på min nivå dock. Jag vägrar gå en nybörjarkurs.

charlie
0
#7

#6 Man skulle kunna tro att index funkade på det viset. Men tänk på index mer som ett index i en bok, det skulle bli ganska förvirrande om det var sorterat på titel och kapitelnummer samtidig.

Skulle du vilja göra en sökning på kapitelnummer, så vill du ha ett index som är indelat därefter, meddans om du söker i bokstavorning så vill du ha ett index som är indelat efter titel.

---

mans
0
#8

Så egentligen skulle man då göra ett index för varje fält man vill kunna sortera/söka på?

charlie
0
#9

Precis.

En varning dock, index kostar i diskutrymme och prestanda, framförallt när man lägger till data, så måste kanske index byggas om.

---

Erik
0
#10

… och för att upprepa min varning så kan det också försvåra frågeoptimeringen. Har dock ingen aning om hur ofta det verkligen ställer till problem. =P

mans
0
#11

Det här är väldigt intressant. Tack för tipsen!

charlie
0
#12

#11

Något ska väl våran (Eriks & min) utbildning utmynna i… ;)

---

johan
0
#13

Då verkar det som jag tänkt rätt när jag sätter index. Jag brukar ha klustrat index på det som jag absolut oftast filtrerar på. Därefter har jag ett index för de de filter jag vet att jag ofta kommer använda, samt index för den kolumn som jag vet att jag oftast kommer att sortera på.

Utöver det försöker jag vara noga att sätta fälten i WHERE-satsen i samma ordningen som de är i indexet och eventuella oindexerade fält får komma sist i WHERE-satsen.

Mvh // Johan

charlie
0
#14

Det där med att oindexerade fält kommer sist är en ganska så viktig sak. Man vill föröska eliminera så många icke relevanta rader så snabbat som möjligt. Detta för att de följande operationerna exekverar på ett så litet dataset som möjligt.

---