Policy för databasen rörande index samt lite tips om hastighet
Mycket av resurserna för databasservrarna på det delade webhotellet
tenderar tyvärr att ätas upp av fulltextsökningar i databasen eller
förfrågningar som inte använder index. Om det går att använda
index för din databas så skall du göra det.
Om det inte går att använda index så bör du troligen inte
använda databasen utan istället lägga dina data i någon lämplig
textfil eller fildatabas eller motsvarande i din hemkatalog så att
varje webserver för sig direkt kan söka i datat. Detta går dessutom
snabbare då varje webserver kan spara datat en tid i internminnet
efter att den har läst det från filservern, till skillnad från
resultat från databasen som inte sparas. Och det är mycket enklare för
Levonline att bygga ut prestandan med fler webfarmdatorer om det
behövs CPU-kraft där än med fler databas-servrar.
Problemet med att inte använda index är att oavsett hur mycket
hårdvara Levonline lägger på databas-servrarna så kan det alltid ätas
upp av ineffektiva förfrågningar. Det går bra när det är låg last och
små tabeller men ju mer data och högre last det blir desto långsammare
går det. Med index så går det bra att ha stora tabeller.
Ligger du på databasen mysql.levonline.com och har
stora databaser kan det hjälpa att migrera databasen till vår andra
databasserver innodb.levonline.com som stödjer
tabellformatet InnoDB. Kontakta oss så skapar vi en databas åt dig på
den servern. Några av fördelarna med InnoDB som tabellformat istället
för MyISAM är att InnoDB stödjer användning av index även för ORDER
BY, row-level-locking samt transaktioner.
Det finns ett bra avsnitt i manualen för MySQL under Performance Tuning Tips som
beskriver vad man ska tänka på för att få bra prestanda. Här följer
några grundläggande saker som kan vara bra att kolla upp först:
- Se till att använda index i
tabellerna. Utan index kommer din databas att gå långsammare
och långsammare ju större tabellerna blir. Så här gör du för att
lägga till index: ALTER TABLE mintabell ADD INDEX
(kolumnen);
- Om du vet att indexet är unikt så använd unikt index istället,
det är alltid bättre. Unikt index innebär att kolumnen unikt
identifierar raden, tex ett personnummer eller användaridentitet. Så
här lägger man till det: ALTER TABLE mintabell ADD UNIQUE INDEX
(kolumnen);
- Om du har möjlighet så använd primary key som är snäppet
effektivare än ett vanligt index eftersom det sparas nära
tabelldatat. En tabell kan bara ha en primary key. Primary key är ett
unikt index. Så här kan man lägga till en primary key: ALTER
TABLE mintabell ADD PRIMARY KEY (kolumnen);
- Kontrollera hur index används med hjälp av EXPLAIN. Så
här exempelvis. EXPLAIN SELECT * FROM mintabell WHERE
user='malin';
- Det går inte att använda index om du använder fält av typen BLOB
när InnoDB-tabeller används (dvs servern innodb.levonline.com). Så om
du använder blobbar så skall du inte söka efter dem som nyckel. Låt
därför bli att göra så select * from tabellen where blobben =
"a7432nbd6a643j5"; eller motsvarande. Du kan använda blobbar för
att spara data, men sök inte i dem. Som alternativ kan man använda en
stor VARCHAR istället vilken det går att ha index för. Observera att
det inte räcker att bara konvertera till VARCHAR från BLOB, ett index
måste också läggas till.
- Se till att hämta all data websidan behöver på en gång under en
uppkoppling mot databasen. (Om du exempelvis vill fylla en tabell som
är 20 kolumner bred och 50 rader hög så är det bättre med en enda
uppkoppling än att göra uppåt 1000 stycken om det är en för varje
fält) Se även till att hämta all data direkt som en stor tabell
istället för att göra en förfrågan per fält så tjänar du en massa
tid.
- Undvik låsning av tabellerna. Läs mer om table
locking i manualen för MySQL för hur detta ska uppnås.
- Försök göra tabellerna mindre. Då går det snabbare vilket gör att
exempelvis låsning av tabeller inte blir så farligt.
- Se till att optimera dina
querys så att de går så snabbt som möjligt.
- Lägg inte onödiga data i databasen. Om du exempelvis skall ha ett
arkiv med bilder så är det effektivare att lagra bara filnamnet i databasen och sedan ha själva bilden som en fil i hemkatalogen. Att
lagra även själva bildens innehåll i databasen tar bara resurser i
onödan.