Citat:
Ursprungligen postat av
SweCrime
Ja 10 minuter är lång tid och det är också därför jag vill ha tips på hur jag förbättrar allt. Mina tabeller ligger på runt 10 miljoner rows. Och dessa joinas och det ena och den andra, men sen så används dom också flitigt av våra kunder och det är också därför det segas ner.
Mina fem öre för att få sql-frågor att leverera svar snabbare:
* Indexera lagom mycket. Ett index kostar prestandamässigt dubbelt så mycket vid skrivningar, som vid läsningar, så att bara slentrianmässigt slänga på index kan straffa sig vid insert/update/delete-sql. Men har man fler läsningar än skrivningar mot den tabellen, är det oftast ingen fara
* Vid skrivningar låses tabeller för läsning, vilket kan få till synes enkla läsfrågor att ta tid att leverera ett svar. Så har du krångliga, tidskrävande skrivningar till databasen, som sker ofta, kan det vara en faktor att titta på.
* Om möjligt, när du skriver dina select-satser, joina ihop tabellerna så att varje join i sig, skapar så litet resultatset som möjligt. Vad menar jag med det då? Jo, har du tre tabeller som du ska joina ihop, på 10, 100 och 1000-rader, så börja med de minsta tabellerna. Då får du ett internt resultatset på 1000 rader. Hade du istället tagit de två största tabellerna hade du haft ett resultatset som varit hundra gånger större. Visst, när du joinar ihop alla tre tabeller, så har du lika stort resultatset oavsett hur du gör, men jag finner att det går snabbare att gå från minsta till störst. Att lägga på where-vilkoren på joinarna istället, kan också snabba upp frågan.
* Försök att inte joina ihop för många tabeller samtidigt. Kan slöa till det. Istället för
SELECT *
FROM tabell1 t1
JOIN tabell2 t2 ON ...
JOIN tabell3 t3 ON ...
JOIN tabell4 t4 ON ...
JOIN tabell5 t5 ON ...
JOIN tabell6 t6 ON ...
kan följande gå snabbare
SELECT *
FROM tabell1 t1
JOIN tabell2 t2 ON ...
JOIN tabell3 t3 ON ...
JOIN (SELECT *
FROM tabell4 t4
JOIN tabell5 t5 ON ...
JOIN tabell6 t6 ON ...) t7 ON...
Verkar som den då hanterar de interna resultatsetten mycket bättre.
* Är det så att användarna ofta ställer samma frågor som får samma svar? Cacha resultatet och använd det istället.