Dårlig databaseydelse er en torn i øjet på enhver DBA. Og det er ikke altid let at isolere årsagen til præstationsproblemer, hvilket kun øger stresset.
Tuning af dine SQL Server-databaser er en fantastisk måde at løse nogle af dine præstationsproblemer på, men det er måske ikke altid indlysende, hvor du skal starte optimeringsprocessen. Hvis du udelukker diskplads, hukommelse og andre dræbere netværks- og hardwareydeevner, og din SQL Server-ydeevne stadig halter, er det tid til at grave i dine forespørgsler.
Uoptimerede forespørgsler kan forårsage utallige ydelsesproblemer for dine systemer. På den lyse side er nogle få almindelige forespørgselsfejl ansvarlige for hovedparten af databasens ydeevneforringelse.
Hvis dine forespørgsler lider af nogle af disse seks problemer, så gør dig klar til en seriøs justering af ydeevnen.
Problemforespørgsel nr. 1:Ligesom udtryk med førende jokertegn
Førende jokertegn forhindrer MySQL i at bruge indekser, hvilket tvinger en fuld tabelscanning, selvom du har indekseret et felt i tabellen. Scanning af alle rækkerne i en tabel forsinker leveringen af dine forespørgselsresultater betydeligt, så fjern det førende jokertegn for at forbedre effektiviteten.
Problemforespørgsel nr. 2:Ikke-indekserede kolonner brugt i klausulerne "Hvor" og "Grupper efter"
Indeksering af kolonner hjælper med at returnere forespørgselsresultater hurtigere, fordi det eliminerer behovet for fulde tabelscanninger. Indeksering hjælper også med at sortere poster, når de returneres, og garanterer, at disse poster er unikt identificerbare, hvilket er særligt nyttigt i tabeller med mere end 10 rækker.
For lidt perspektiv kan du overveje at køre en "forklar"-sætning i din forespørgselsanalyse før og efter indeksering. Dette vil give dig en idé om, hvor mange rækker af scanning du lige har gemt dig selv.
Problemforespørgsel nr. 3:Ligesom erklæringer, der bruger "eller"-operatøren i stedet for en unionsklausul
Det kan være nyttigt at køre forespørgsler ved hjælp af sammenligningsoperatoren "eller" på felter eller kolonner i en tabel, men at anvende "eller" for ofte i en "where"-sætning er endnu et hurtigt vej til en fuld tabelscanning.
En unionsklausul kan få SQL-forespørgslen til at køre hurtigere, især hvis forskellige indekser optimerer hver side af forespørgslen. Grundlæggende tager fagforeningsoperatøren resultaterne af to hurtige, indekserede forespørgsler og slår dem sammen til én.
Problemforespørgsel nr. 4:Jokertegnsøgninger
Hvis du sidder fast i en situation, hvor du har brug for at søge med jokertegn, men du ikke ønsker at tage præstationshittet, så prøv at bruge en MySQL fuldtekstsøgning. Fuldtekstsøgninger er betydeligt hurtigere end at søge med jokertegn, og du får den ekstra fordel af mere relevante resultater, når du søger i store databaser.
Problemforespørgsel nr. 5:Ikke-optimeret databaseskema
Du kan kun forbedre SQL-forespørgselsydeevnen så meget, hvis du ikke også optimerer dit databaseskema. Her er et par tips til forbedring:
Normaliser tabeller
Dataredundans skader ydeevnen, så sørg for kun at repræsentere et faktum én gang i databasen. Hvis du f.eks. henviser til en kunde i mere end én tabel, skal du kun bruge "kundenavn" én gang, og derefter bruge "kunde_id" til efterfølgende referencer.
Brug optimale datatyper
Nogle vigtige punkter at huske, når det kommer til datatyper:
- Kortere er bedre, når du designer tabeller. Brug f.eks. "TINYINT"-datatypen til feltet "user_id" for en systembrugertabel med færre end 100 brugere.
- Brug en "dato_tid"-datatype, hvis et felt forventer en datoværdi, så du ikke behøver at konvertere registreringerne til datoformat bagefter.
- MySQL fungerer bedre med heltalsværdier, end det gør med tekstdatatyper, inklusive varchar.
Undgå nulværdier
Nulværdier i en kolonne kan skade dine forespørgselsresultater, så du skal muligvis tildele en standardværdi for felter, hvor poster ikke kræver en obligatorisk værdi.
Brug ikke for mange kolonner
Brede tabeller (mere end 100 kolonner) kræver en masse CPU og ressourcer at behandle. Medmindre du absolut skal inkludere et bredt bord, er det bedre at opdele det i mindre, logiske tabeller.
Optimer tilslutninger
SQL-sætninger med for mange joinforbindelser (og joinforbindelser med for mange tabeller) påvirker ydeevnen negativt. Skyd for ikke mere end 12 joins for hver forespørgsel.
Problemforespørgsel nr. 6:MySQL-forespørgsler uden cache
Websites og applikationer, der udfører mange udvalgte forespørgsler, vil drage fordel af at cache MySQL-forespørgsler. Caching af MySQL-forespørgsler fremskynder ydeevnen under læseoperationer, fordi den cacher den valgte forespørgsel sammen med det resulterende datasæt og henter fra hukommelsen (ikke disk), hvis forespørgslen udføres mere end én gang.
Ydeevnejustering er afgørende for at opretholde høj tilgængelighed for dine SQL Server-databaser og sikre, at dine slutbrugere er glade. Men det er desværre ikke altid umiddelbart indlysende, hvor der er mest behov for tuning. Hvis du har elimineret de åbenlyse netværks- og hardwarekilder for ydeevneproblemer, skal du flytte dit fokus til dine forespørgsler.
Hvis du har arbejdet som DBA i længere tid, har du sandsynligvis stødt på en (eller alle) af disse problemforespørgsler. Nu hvor du ved, hvad du skal være opmærksom på, skal du være proaktiv i dit initiativ til forbedring af ydeevnen og rette disse almindelige forespørgselssmerter, så du kan høste frugterne af SQL Server-forespørgselsoptimering.