- 1. Navnekonvensjon
- 2. Bruk alltid riktig datatype
- 3. Bruk CHAR (1) over VARCHAR (1)
- 4. CHAR for faste data
- 5. Unngå å bruke regionale datoformater
- 6. Optimaliser forespørslene for hurtigbufferen
- 7. Unngå å bruke "SELECT *" i dine søk
- 8. Bruk LIMIT 1 Når du bare vil ha en enkelt rad
- 9. Bruk av ***** BY
- 10. Velg passende basismotor
- 11. Bruk EXISTS -klausulen når det er nødvendig
- 12. Bruk FORKLAR i dine SELECT -søk
- 13. Indekser, og bruk samme type kolonne for Joins
- 14. Bruk IKKE NULL hvis du kan
- 15. Tabeller med fast størrelse (statisk) er raskere
- 16. Vertikal partisjonering
- 17. Lagrer IP -adresser som UNSIGNED INT
- 18. Lag visninger for å forenkle vanlig bruk i tabeller
- 19. Ikke bruk ***** PÅ RAND ()
- 20. Optimaliser WHERE -leddet
MySQL -databasen har blitt den mest populære open source relasjonsdatabasen i verden på grunn av høy ytelse, konsistens, høy pålitelighet og brukervennlighet. Imidlertid påvirkes disse fordelene det gir oss ofte av måten vi jobber med det.
I denne opplæringen lærer du en rekke tips som vil være svært nyttige og som vil tillate oss å få mest mulig ut av både sett fra programmereren og databaseadministratoren.
Hvilket verktøy vil vi bruke?MySQL kommandokonsoll '] MySQL har et program, kalt med samme navn som databasen (mysql) som brukes til å administrere databasen etter kommandolinje.
WindowsDet er i en katalog som:
C: \ Program Files \ MySQL \ MySQL Server 5.6 \ bin
Katalogen kan variere, for eksempel kan den være plassert i roten til C: -disken eller et annet sted hvor vi kan ha installert MySQL. For å få tilgang til MySQL -konsollen i Windows må vi befinne oss i den katalogen.
LinuxSe følgende lenke:
Få tilgang til MySQL fra Linux
MacDatamaskiner med system Mac OS X de har kommandolinjeterminalen innebygd blant de tilgjengelige programmene. For å få tilgang til den samme kommandoen brukes som i Linux.
phpMyAdminDet er et gratis programvareverktøy skrevet i PHP, som brukes til å administrere MySQL via Internett. Hvis du har et lokalt utviklingsmiljø installert, for eksempel XAMPP eller WAMP, vil dette verktøyet allerede være installert. Hvis du har en hostingplan med et administrasjonspanel, tilbyr de fleste av dem dette verktøyet som en MySQL -databaseadministrator.
[color = rgb (169,169,169)] phpMyAdmin fra XAMPP [/ color]
FORSTØRRE
[color = # a9a9a9] phpMyAdmin fra CPanel [/ color]
Når vi har disse to verktøyene for hånden, kan vi begynne å teste alle disse gode fremgangsmåtene som vi viser nedenfor.
Disse er Topp 20 MySQL beste fremgangsmåter:
1. Navnekonvensjon
Det er kodestandarder for alle programmeringsspråk, men i MySQL -termer har vi ikke funnet noen universell kodingspraksis som alle følger. Ved å gjennomgå flere åpen kildekode -rammer basert på PHP, filtrerer vi imidlertid ut noen generelle applikasjonsregler som vil hjelpe oss med å skrive SQL -spørringer raskere, eliminere forvirring og konflikter, både i spørringen og i programmeringsspråket vi bruker.
Generelle reglerHusk følgende regler for å unngå problemer.
- Bruk små bokstaver ettersom det hjelper deg med skrivehastigheten, det vil unngå feil i tilfelle små og store sensitive funksjoner, etc.
- Ikke bruk mellomrom, bruk understrek (_) i stedet.
- Ikke bruk tall i navnene, bare engelske alfabetiske tegn.
- Bruk gyldige forståelige navn.
- Navn skal være selvforklarende.
- Navn må ikke inneholde mer enn 64 tegn.
- Unngå å bruke prefikser.
Regler for databasenavnFølg alle de generelle reglene ovenfor.
- Navnet kan være både entall og flertall, men databasen representerer en database, så den bør være entall så mye som mulig.
- Unngå prefikser der det er mulig.
Regler for tabellenavnBruk små bokstaver for tabellenavn: MySQL er vanligvis hostet på Linux -servere, det er store og små bokstaver, så beste praksis er å bruke små bokstavnavn.
- Navnene på tabellene må stå i entall: tabellen er en enkelt enhet som modellen, så det er rart å ha navnet på tabellen i flertall.
- Prefikser i tabellnavnet: Vi har sett mange ganger at tabeller er prefiks med navnet på databasen eller navnet på prosjektet. Noen ganger er dette nødvendig når vi i vårt prosjekt har mange databaser for å overvinne begrensningen til noen hostingleverandører. Men hvis det ikke er nødvendig og prosjektet vårt er lite, unngå å bruke prefikser.
Navn på felteneBruk alle reglene ovenfor, det vil si bruk små bokstaver, ikke bruk tomme mellomrom, ikke bruk tall, og unngå prefikser.
- Bruk ett eller to korte ord der det er mulig.
- Navnene på feltene må kunne forstås, for eksempel: pris, firmanavn, etc.
- Navn på primær kolonne: Primærnøkkel kan ha ID -navn eller tabellnavn _id. Det vil avhenge av valget.
- Unngå å bruke reserverte ord i feltene: *****, dato, etc. I disse tilfellene er det å foretrekke å bruke prefikser som record_date, etc.
- Unngå å bruke kolonnenavn med samme tabellnavn. Dette kan forårsake forvirring når du skriver spørsmålene dine.
- Unngå navn i forkortede eller sammenkoblede akronymer.
2. Bruk alltid riktig datatype
Bruk datatyper basert på dataenes art. Bruk av irrelevante datatyper kan ta mer plass eller føre til feil.
EksempelBruk av varchar (20) til å lagre datetime-verdier i stedet for DATETIME kan forårsake feil under datorelaterte tidsberegninger, og er også mulig i tilfelle ugyldig datalagring.
3. Bruk CHAR (1) over VARCHAR (1)
Hvis du lagret en enkelt tegnrekke, bruk CHAR (1) i stedet for VARCHAR (1) fordi VARCHAR (1) vil ta en ekstra byte for å lagre informasjon. Som man skal ta hensyn til når man håndterer disse tegnene.
4. CHAR for faste data
Bruk CHAR -data til å lagre bare dataene med fast lengde
Eksempel:
Å bruke CHAR (1000) i stedet for VARCHAR (1000) bruker mer plass hvis lengden på dataene er mindre enn 1000.
5. Unngå å bruke regionale datoformater
Når du bruker datatyper:
- DATO TID
- DATO
Bruk alltid YYYY-MM-DD-formatet eller ISO-datoformatet som passer din SQL-motor. Andre regionale formater som DD-MM-ÅÅÅ, DD-MM-ÅÅÅÅ blir ikke lagret riktig.
6. Optimaliser forespørslene for hurtigbufferen
mest av MySQL -servere har hurtigbuffersystemet aktivert. Det er en av de mest effektive metodene for å forbedre ytelsen, som kommer fra databasemotorens hånd. Når den samme forespørselen utføres flere ganger, hentes resultatet fra hurtigbufferen, noe som er mye raskere.
Følgende eksempel er i PHP:
// Cache fungerer IKKE $ r = mysql_query ("VELG navn FRA brukere HVOR post> = CURDATE ()");
// Cache FUNGERER $ i dag = date ("Y-m-d"); $ r = mysql_query ("VELG navn FRA brukere HVOR post> = '$ i dag'");Grunnen til at det ikke fungerer i det første tilfellet er på grunn av bruk av CURDATE (). Den kan brukes på alle ikke-deterministiske funksjoner, for eksempel NOW () og RAND (). Siden resultatet som returneres av funksjonen kan endre seg, bestemmer MySQL seg for å deaktivere hurtigbufferen på den spørringen.
7. Unngå å bruke "SELECT *" i dine søk
Som en generell tommelfingerregel, jo flere data som leses fra tabellene, jo tregere blir det søkt. Med tanke på at noen produksjonstabeller kan inneholde dusinvis av kolonner, hvorav noen består av store datatyper, ville det være uklokt å velge dem alle.
Det er en god vane spesifiser de nødvendige kolonnene i SELECT -setningen.
8. Bruk LIMIT 1 Når du bare vil ha en enkelt rad
Noen ganger når du spør etter bordene dine, og du vet at du bare trenger en rad. I disse tilfellene må du be om et enkelt resultat fra databasen, ellers sjekker den hver og en av kampene i WHERE -klausulen.
I disse tilfellene kan det å øke LIMIT 1 i spørringen forbedre hastigheten betydelig. På denne måten slutter databasen å skanne resultatene i det øyeblikket den finner en, i stedet for å gå gjennom hele tabellen eller en indeks.
// Jeg har brukere fra Madrid? // hva IKKE skal gjøre: $ r = mysql_query ("VELG * FRA bruker HVOR by = 'Madrid'"); hvis (mysql_num_rows ($ r)> 0) {//…} // mye bedre: $ r = mysql_query ("SELECT 1 FROM user WHERE city =‘ Madrid ’LIMIT 1”); hvis (mysql_num_rows ($ r)> 0) {//…}[farge = # a9a9a9]LIMIT anbefaling[/Farge]
9. Bruk av ***** BY
Bruken av ***** AV det kan bremse responstiden i flerbrukermiljøer. Så vi anbefaler at ***** BY -klausulen bare brukes når det er nødvendig.
Ikke misbruk bruken.
10. Velg passende basismotor
Hvis du utvikler et program som leser data oftere enn å skrive.
(for eksempel søkemotor), velg MyISAM -lagringsmotoren.
Hvis du utvikler et program som skriver data oftere enn å lese
(for eksempel sanntidsbank), velg InnoDB lagringsmotor.
Valg av feil lagringsmotor vil påvirke ytelsen til dine søk.
11. Bruk EXISTS -klausulen når det er nødvendig
Hvis du vil se etter data, må du ikke bruke:
Hvis (VELG telle (*) fra tabell HVOR col = 'noen verdi')> 0Bruk i stedet EXISTS -klausulen:
Hvis EKSISTERER (VELG * fra tabell WHERE col = 'some value')Som er raskere i responstid.
12. Bruk FORKLAR i dine SELECT -søk
Ved å bruke søkeordet FORKLAR vil du få mange interne detaljer om hva MySQL gjør for å utføre søket. Dette kan hjelpe deg med å oppdage flaskehalser og andre problemer med spørringen eller bordstrukturen.
Resultatet av en FORKLAR -spørring viser deg indeksene som brukes, hvordan tabellen blir utforsket, hvordan den blir bestilt, etc.
Velg en SELECT -spørring (helst en kompleks, med joins), og legg til ordet FORKLAR i begynnelsen av alt. Det vil returnere resultatene i en enkel tabell. Anta for eksempel at jeg glemte å indeksere en kolonne, det ville vise oss følgende skjermbilde:
FORSTØRRE
Etter å ha lagt indeksen til statstabellen ville det se slik ut:
FORSTØRRE
13. Indekser, og bruk samme type kolonne for Joins
Hvis søknaden din inneholder mange JOIN -setninger, må du sørge for at kolonnene du blir med i, blir indeksert i begge tabellene. Dette påvirker hvordan MySQL internt optimaliserer BLI MED.
Kolonnene du slutter deg til må også være av samme type. For eksempel, hvis du blir med i en kolonne av typen DECIMAL med en kolonne av typen INT fra en annen tabell, vil ikke MySQL kunne bruke minst en av de to indeksene. Selv tegnkodingen må være av samme type for kolonnene Stringtype.
// ser etter selskaper i byen min $ r = mysql_query ("VELG bedriftsnavn FRA brukere LEFT JOIN companyias ON (users.city = companyias.city) WHERE users.id = $ user_id");Begge bykolonner må indekseres, og begge skal være av samme type og tegnkoding, eller MySQL må fullstendig skanne tabellene.
14. Bruk IKKE NULL hvis du kan
Med mindre du har en bestemt grunn til å bruke NULL -verdien, bør du alltid sette kolonnene til NOT NULL.
Spør deg selv først om det vil være en forskjell mellom å ha en tom streng og en NULL -verdi (eller for INT -felt: 0 versus NULL). Hvis det ikke er noe problem mellom de to verdiene, trenger du ikke et NULL -felt. NULL -kolonner krever ekstra plass og kan legge til kompleksitet i sammenligningssetningene. Bare unngå dem når du kan.
Uansett forstår vi at det i noen helt spesifikke tilfeller er en grunn til å bruke NULL -kolonner, noe som ikke alltid er en dårlig ting.
15. Tabeller med fast størrelse (statisk) er raskere
Når hver kolonne i en tabell har en fast lengde, regnes hele tabellen som "statisk" eller "fast lengde".
Noen eksempler på kolonnetyper som IKKE er faste størrelser er:
- VARCHAR
- TEKST
- BLOB
Hvis du bare inkluderer en av disse kolonnetypene, vil tabellen ikke lenger være av fast størrelse og må behandles annerledes av MySQL -motor.
Tabeller i fast størrelse kan øke produktiviteten fordi det er raskere for MySQL-motoren å søke gjennom postene dine. Når du vil lese en bestemt rad i tabellen, kan du raskt beregne posisjonen. Hvis radstørrelsen ikke er fast, må du først søke indeksen til hovednøkkelen hver gang du må søke.
De er også lettere å søke etter, og å bygge om etter en ulykke. Men på den annen side kan de også ta mer plass.
16. Vertikal partisjonering
Vertikal partisjonering er handlingen om å skille bordstrukturen vertikalt av optimaliseringshensyn.
Eksempel 1:
Du vil sikkert ha en brukertabell som inneholder en postadresse, som ikke brukes så ofte. Her kan du dele bordet og lagre adressene i en egen tabell. På denne måten vil hovedbrukerbordet ha en strammere størrelse. Som du vet, jo mindre jo raskere bordene.
Eksempel 2:
Du har et "last_access" -felt i tabellen. Den oppdateres hver gang en bruker får tilgang til siden din. Men hver tilgang fører til at hurtigbufferen for tabellen frigjøres. Det du kan gjøre er å sette dette feltet i en annen tabell, slik at endringene i brukerbordet ditt holdes på et minimum.
Men du må også sørge for at du ikke trenger å bli med de to bordene hele tiden etter partisjonering, ellers vil du få et ytelsesfall, akkurat det motsatte av det vi lette etter.
17. Lagrer IP -adresser som UNSIGNED INT
Mange programmerere ville lage en VARCHAR -felt (15) uten å innse at de kan lagre IP -adresser som hele tall. Når du bruker en INT bruker du bare 4 byte i minnet, og den har også en fast størrelse i tabellen.
Men du må sørge for at kolonne er UNSIGNED INT (usignert heltall) fordi IP-adresser bruker hele det 32-biters usignerte området.
I dine spørsmål kan du bruke INET_ATON () -funksjon å konvertere en IP -adresse til et heltall, og INET_NTOA () for å gjøre det motsatte. Det er også lignende funksjoner i PHP som kalles ip2long () Y long2ip ().
18. Lag visninger for å forenkle vanlig bruk i tabeller
Visninger hjelper til med å forenkle både komplekse skjemaer og implementering av sikkerhet. En måte de bidrar til sikkerhetsdelen er at den lar deg skjule navnene på feltene for utviklerne.
Den kan også brukes til å filtrere kolonner som ikke er indeksert, og bare la feltene som vises raskere i søket.
19. Ikke bruk ***** PÅ RAND ()
Dette er et av de triksene som høres bra ut ved første øyekast, og hvor mange nybegynnere programmerere har en tendens til å falle. Du har kanskje ikke innsett den utrolige flaskehalsen som kan skyldes å bruke denne teknikken i forespørslene dine.
Hvis du virkelig trenger tilfeldige tabeller for resultatet ditt, er det mye bedre måter å gjøre det på. Det er klart at de vil ta opp mer kode, men du vil forhindre en mulig flaskehals som øker eksponentielt etter hvert som innholdet ditt vokser.
Problemet er at MySQL må kjøres RAND () (som krever prosessorkraft) for hver av radene før du sorterer dem og returnerer en enkelt rad.
// måten IKKE gjør det: $ r = mysql_query ("VELG brukernavn FRA bruker ***** PÅ RAND () LIMIT 1"); // mye bedre: $ r = mysql_query ("SELECT count (*) FROM user"); $ d = mysql_fetch_row ($ r); $ rand = mt_rand (0, $ d [0] - 1); $ r = mysql_query ("VELG brukernavn FRA brukernavn LIMIT $ rand, 1");Så du velger et tilfeldig tall mindre enn antall resultater og bruker det som forskyvningen i LIMIT -klausulen.
20. Optimaliser WHERE -leddet
Dette er noen tips for å optimalisere WHERE -klausulen:
- Fjern unødvendige parenteser. For eksempel:
Fra til5 OG b = c OG a = 5
- TELLE (*) den er optimalisert for å returnere en SELECT mye raskere, så lenge den er til et bord og uten å bruke WHERE. For eksempel:
VELG TELL (*) FRA tabellen.
- De Alternativet SQL_SMALL_RESULT, kan brukes med GRUPPE AV eller TYDELIG for å indikere at resultatsettet er lite. I dette tilfellet bruker MySQL veldig raske midlertidige tabeller for å lagre den resulterende tabellen i stedet for å bruke sortering.
MySQL -opplæringsprogrammer