Top 20 preporuka za MySQL

Sadržaj

MySQL baza podataka postala je najpopularnija relacijska baza podataka otvorenog koda u svijetu zbog svojih visokih performansi, dosljednosti, visoke pouzdanosti i jednostavnosti uporabe. Međutim, na ove prednosti koje nam nudi često utječe način na koji radimo na tome.

U ovom vodiču naučit ćete niz savjeta koji će biti vrlo korisni i koji će nam omogućiti da izvučemo maksimum iz perspektive programera i administratora baze podataka.

Koji ćemo alat koristiti?Naredbena konzola MySQL '] MySQL ima program, nazvan s istim imenom kao i baza podataka (mysql) koji se koristi za upravljanje bazom podataka putem naredbenog retka.

WindowsNalazi se u direktoriju poput:

C: \ Program Files \ MySQL \ MySQL Server 5.6 \ bin

Direktorij se može razlikovati, na primjer, može se nalaziti u korijenu C: diska ili na bilo kojem drugom mjestu gdje smo možda instalirali MySQL. Za pristup MySQL konzoli u sustavu Windows moramo se nalaziti unutar tog direktorija.

LinuxPogledajte sljedeću vezu:

Pristupite MySQL -u iz Linuxa

MacRačunala sa sustavom Mac OS X među dostupnim aplikacijama ugrađen je terminal naredbenog retka. Za pristup se koristi ista naredba kao u Linuxu.

phpMyAdminTo je besplatni softverski alat napisan na PHP -u, koji se koristi za upravljanje MySQL -om putem Interneta. Ako imate instalirano lokalno razvojno okruženje, na primjer XAMPP ili WAMP, ovaj će alat već biti instaliran. Ako imate plan hostinga s administrativnom pločom, većina njih nudi ovaj alat kao administrator baze podataka MySQL.

[color = rgb (169,169,169)] phpMyAdmin iz XAMPP -a [/ color]

POVEĆAJTE

[color = # a9a9a9] phpMyAdmin iz CPanela [/ color]

Imajući ova 2 alata pri ruci, možemo početi testirati sve ove dobre prakse koje ćemo prikazati u nastavku.

Ovi su 20 najboljih praksi u MySQL -u:

1. Konvencija o imenovanju


Postoje standardi kodiranja za svaki programski jezik, ali u terminima MySQL nismo pronašli univerzalne prakse kodiranja koje svi slijede. No, pregledom nekoliko okvira otvorenog koda koji se temelje na PHP -u ​​filtriramo neka opća pravila primjene koja će nam pomoći da brže pišemo SQL upite, eliminiramo zabune i sukobe, kako u upitu tako i u programskom jeziku koji koristimo.

Opća pravilaImajte na umu sljedeća pravila kako biste izbjegli probleme.

  • Koristite mala slova jer vam pomaže pri brzini pisanja, izbjeći ćete pogreške u slučaju funkcija osjetljivih na mala i velika slova itd.
  • Nemojte koristiti razmake, umjesto toga koristite donju crtu (_).
  • Nemojte koristiti brojeve u imenima, samo engleske abecedne znakove.
  • Koristite valjana razumljiva imena.
  • Imena bi trebala biti sama po sebi razumljiva.
  • Imena ne smiju sadržavati više od 64 znaka.
  • Izbjegavajte korištenje prefiksa.

Pravila za nazive baza podatakaSlijedite sva gore navedena opća pravila.

  • Naziv može biti i jednina i množina, ali baza podataka predstavlja bazu podataka pa bi trebala biti što je moguće više jednina.
  • Izbjegavajte prefikse gdje je to moguće.

Pravila za nazive tablicaZa nazive tablica koristite mala slova: MySQL se obično nalazi na Linux poslužiteljima, osjetljiva je na velika i mala slova pa je najbolja praksa mala imena malih tablica.

  • Nazivi tablica moraju biti u jednini: tablica je jedna cjelina kao i model, pa je čudno ime tablice u množini.
  • Prefiksi u nazivu tablice: Mnogo smo puta vidjeli da tablice imaju prefiks imena baze podataka ili naziva projekta. Ponekad je to potrebno kada u našem projektu imamo mnogo baza podataka kako bismo prevladali ograničenja nekih pružatelja usluga hostinga. No ako to nije potrebno, a naš je projekt mali, izbjegavajte korištenje prefiksa.

Naziv poljaKoristite sva gore navedena pravila, odnosno koristite mala slova, nemojte koristiti prazna mjesta, ne koristite brojeve i izbjegavajte prefikse.

  • Po mogućnosti upotrijebite jednu ili dvije kratke riječi.
  • Imena polja moraju biti razumljiva, na primjer: cijena, naziv tvrtke itd.
  • Naziv primarnog stupca: Primarni ključ može imati naziv id ili naziv tablice _id. To će ovisiti o izboru.
  • Izbjegavajte korištenje rezerviranih riječi u poljima: *****, datum itd. U tim slučajevima poželjno je koristiti prefikse poput zapisa_data itd.
  • Izbjegavajte upotrebu naziva stupaca s istim nazivom tablice. To može uzrokovati zabunu pri pisanju upita.
  • Izbjegavajte nazive u skraćenim ili spojenim akronimima.

2. Uvijek koristite ispravnu vrstu podataka


Koristite vrste podataka na temelju prirode podataka. Korištenje nevažnih vrsta podataka može zauzeti više prostora ili dovesti do pogrešaka.

PrimjerKorištenje varchar (20) za spremanje vrijednosti datuma i vremena umjesto DATETIME može uzrokovati pogreške tijekom izračuna vremena povezanih s datumom, a moguće je i u slučaju nevažeće pohrane podataka.

3. Upotrijebite CHAR (1) umjesto VARCHAR (1)


Ako ste pohranili jedan niz znakova, upotrijebi CHAR (1) umjesto VARCHAR (1) jer će VARCHAR (1) uzeti dodatni bajt za pohranu podataka. S čime bi se to trebalo uzeti u obzir pri upravljanju tim likovima.

4. CHAR za fiksne podatke


Koristite podatke CHAR za spremanje samo podataka fiksne duljine

Primjer:

Korištenje CHAR (1000) umjesto VARCHAR (1000) zauzima više prostora ako je duljina podataka manja od 1000.

5. Izbjegavajte korištenje regionalnih formata datuma


Prilikom upotrebe vrsta podataka:
  • DATUM VRIJEME
  • DATUM

Uvijek koristite format GGGG-MM-DD ili ISO format datuma koji odgovara vašem SQL stroju. Ostali regionalni formati poput DD-MM-GGG, DD-MM-GGGG neće biti pravilno pohranjeni.

6. Optimizirajte svoje zahtjeve za predmemoriju


većina od MySQL poslužitelji imaju omogućen sustav predmemorije. To je jedna od najučinkovitijih metoda za poboljšanje performansi, koja dolazi iz ruke stroja baze podataka. Kada se isti zahtjev izvršava više puta, rezultat se dohvaća iz predmemorije, što je mnogo brže.
Sljedeći primjer je u PHP -u:
 // Cache NE radi $ r = mysql_query ("SELECT name FROM users WHERE record> = CURDATE ()"); 
 // Cache DOES work $ today = date ("Y-m-d"); $ r = mysql_query ("ODABERITE ime od korisnika WHERE zapis> = '$ danas'"); 
Razlog zašto ne radi u prvom slučaju je upotreba CURDATE (). Može se primijeniti na sve nedeterminističke funkcije, poput NOW () i RAND (). Budući da se rezultat koji funkcija vraća može promijeniti, MySQL odlučuje onemogućiti predmemoriju tog upita.

7. Izbjegavajte korištenje "SELECT *" u svojim upitima


Općenito, što se više podataka čita iz tablica, sporije se postavlja upit. S obzirom na to da neke proizvodne tablice mogu sadržavati desetke stupaca, od kojih su neke sastavljene od velikih tipova podataka, ne bi bilo pametno odabrati sve njih.

To je dobra navika navedite potrebne stupce u vašem SELECT izrazu.

8. Koristite OGRANIČENJE 1 Kada želite samo jedan redak


Ponekad kada postavljate upite za svoje tablice i znate da vam je potreban samo jedan redak. U tim slučajevima morate zatražiti jedan rezultat iz baze podataka, inače će provjeriti svako podudaranje u odredbi WHERE.

U tim slučajevima dodavanjem OGRANIČENJA 1 u vaš upit možete značajno poboljšati brzinu. Na taj će način baza podataka prestati skenirati rezultate onog trenutka kada ih pronađe, umjesto da pregleda cijelu tablicu ili indeks.

 // Imam korisnike iz Madrida? // što NE činiti: $ r = mysql_query ("SELECT * FROM user WHERE city = 'Madrid'"); if (mysql_num_rows ($ r)> 0) {//…} // mnogo bolje: $ r = mysql_query ("ODABERI 1 OD korisnika WHERE grad = 'Madrid' OGRANIČENJE 1"); if (mysql_num_rows ($ r)> 0) {//…}
[color = # a9a9a9]LIMIT preporuka[/Boja]

9. Korištenje ***** BY


Korištenje ***** BY može usporiti vrijeme odziva u višekorisničkim okruženjima. Stoga preporučujemo da se ***** BY klauzula koristi samo kada je to potrebno.

Ne zloupotrebljavajte njegovu upotrebu.

10. Odaberite odgovarajući osnovni motor


Ako razvijete aplikaciju koja čita podatke češće nego pisanje.
(na primjer: tražilica), odaberite mehanizam za pohranu MyISAM.

Ako razvijete aplikaciju koja češće zapisuje podatke od čitanja
(na primjer: bankarstvo u stvarnom vremenu), odaberite InnoDB mehanizam za pohranu.

Odabir pogrešnog stroja za pohranu utjecat će na izvedbu vaših upita.

11. Koristite klauzulu EXISTS kad god je to potrebno


Ako želite provjeriti ima li podataka, nemojte koristiti:
 Ako je (SELECT count (*) iz tablice WHERE col = 'neka vrijednost')> 0
Umjesto toga upotrijebite klauzulu EXISTS:
 Ako POSTOJI (SELECT * iz tablice WHERE col = 'neka vrijednost')
Što je brže u vremenu odziva.

12. Koristite EXPLAIN u vašim SELECT upitima


Korištenje ključne riječi EXPLAIN pružit će vam puno internih detalja o tome što MySQL radi kako bi izvršio vaš upit. To vam može pomoći da uočite uska grla i druge probleme s vašim upitom ili strukturom tablice.

Rezultat upita EXPLAIN pokazat će vam indekse koji se koriste, kako se istražuje tablica, kako se naručuje itd.

Odaberite upit SELECT (po mogućnosti složen, sa spojevima) i dodajte riječ EXPLAIN na početku svega. Vratit će rezultate u jednostavnu tablicu. Na primjer, pretpostavimo da sam zaboravio indeksirati stupac, to će nam pokazati sljedeći zaslon:

POVEĆAJTE

Nakon dodavanja indeksa u tablicu stanja to bi izgledalo ovako:

POVEĆAJTE

13. Indeks, a za pridruživanja koristite istu vrstu stupca


Ako vaša aplikacija sadrži mnogo naredbi JOIN, morate biti sigurni da su stupci kojima se pridružite indeksirani u obje tablice. To utječe na to kako MySQL interno optimizira JOIN operacije.

Također, stupci kojima se pridružujete moraju biti iste vrste. Na primjer, ako se pridružite stupcu tipa DECIMAL sa stupcem tipa INT iz druge tablice, MySQL neće moći koristiti barem jedan od dva indeksa. Čak i kodiranje znakova mora biti iste vrste za stupce Vrsta niza.

 // tražim tvrtke u svom gradu $ r = mysql_query ("SELECT company_name FROM users LEFT JOIN companyias ON (users.city = companyias.city) WHERE users.id = $ user_id");
Oba stupca grada moraju biti indeksirana, a oba trebaju biti iste vrste i kodiranja znakova ili će MySQL morati izvršiti potpuno skeniranje tablica.

14. Koristite NOT NULL ako možete


Osim ako nemate poseban razlog za korištenje NULL vrijednosti, svoje stupce uvijek trebate postaviti na NI NULL.

Prije svega, zapitajte se postoji li razlika između praznog niza i NULL vrijednosti (ili za polja INT: 0 u odnosu na NULL). Ako nema problema između dvije vrijednosti, ne trebate polje NULL. NULL stupci zahtijevaju dodatni prostor i mogu dodati složenost vašim usporednim izjavama. Izbjegavajte ih kad god možete.

U svakom slučaju, razumijemo da u nekim vrlo specifičnim slučajevima postoji razlog za korištenje NULL stupaca, što nije uvijek loše.

15. Tablice fiksne veličine (statičke) brže su


Kad je svaki stupac u tablici fiksne duljine, cijela se tablica smatra "statičkom" ili "fiksnom duljinom".

Neki primjeri vrsta stupaca koji NISU fiksne veličine su:

  • VARCHAR
  • TEKST
  • BLOB

Ako uključite samo jednu od ovih vrsta stupaca, tablica više neće biti fiksne veličine i morat će se drugačije tretirati MySQL motor.

Tablice fiksne veličine mogu povećati produktivnost jer MySQL engine brže pretražuje vaše zapise. Kada želite pročitati određeni redak u tablici, možete brzo izračunati njegov položaj. Ako veličina retka nije fiksna, svaki put kad morate pretraživati, najprije morate postaviti upit indeksu primarnog ključa.

Također ih je lakše pretraživati ​​i obnavljati nakon nesreće. No, s druge strane, mogli bi zauzeti i više prostora.

16. Okomita podjela


Vertikalno particioniranje čin je okomitog odvajanja strukture tablice iz razloga optimizacije.

Primjer 1:

Sigurno ćete imati korisničku tablicu koja sadrži poštansku adresu, koja se ne koristi često. Ovdje možete podijeliti tablicu i spremiti adrese u zasebnu tablicu. Na taj bi način vaš glavni korisnički stol imao manju veličinu. Kao što znate, što su manji stolovi su brži.

Primjer 2:

U tablici imate polje "last_access". Ažurira se svaki put kada korisnik pristupi vašoj stranici. No svaki pristup uzrokuje oslobađanje predmemorije upita za tu tablicu. Ono što možete učiniti je staviti ovo polje u drugu tablicu tako da izmjene u vašoj korisničkoj tablici budu svedene na minimum.

Ali također morate paziti da ne morate stalno spajati dvije tablice nakon particioniranja ili ćete doživjeti pad performansi, upravo suprotno od onoga što smo tražili.

17. Pohranjuje IP adrese kao UNSIGNED INT


Mnogi programeri stvorili bi VARCHAR polje (15) ne shvaćajući da mogu pohraniti IP adrese kao cijele brojeve. Kada koristite INT, koristite samo 4 bajta u memoriji, a također ima fiksnu veličinu u tablici.

Ali morate biti sigurni da je stupac je UNSIGNED INT (cijeli bezznačni broj) jer IP adrese koriste cijeli 32-bitni raspon bez potpisa.

U svojim upitima možete koristiti INET_ATON () funkcija pretvoriti IP adresu u cijeli broj, a INET_NTOA () učiniti suprotno. Postoje i slične funkcije u PHP -u ​​koje se nazivaju ip2long () Y long2ip ().

18. Izradite prikaze kako biste pojednostavili uobičajenu uporabu u tablicama


Pogledi pomažu pojednostavniti i složene sheme i sigurnosnu implementaciju. Jedan od načina na koji doprinose sigurnosnom dijelu je taj što vam omogućuje da sakrijete imena polja od programera.

Također se može koristiti za filtriranje neindeksiranih stupaca, ostavljajući samo polja koja se brže prikazuju u pretraživanju.

19. Nemojte koristiti ***** RAND ()


Ovo je jedan od onih trikova koji na prvi pogled zvuče sjajno i na koje mnogi programeri početnici padaju. Možda niste shvatili nevjerojatno usko grlo koje može nastati korištenjem ove tehnike u vašim zahtjevima.

Ako vam za rezultat zaista trebaju slučajne tablice, postoje mnogo bolji načini za to. Jasno je da će zauzeti više koda, ali spriječit ćete moguće usko grlo koje se eksponencijalno povećava kako vaš sadržaj raste.

Problem je u tome što će se MySQL morati pokrenuti RAND () (što zahtijeva procesorsku snagu) za svaki redak prije sortiranja i vraćanja jednog retka.

 // način na koji to NE činite: $ r = mysql_query ("ODABERITE korisničko ime OD korisnika ***** PO RAND () OGRANIČENJE 1"); // mnogo bolje: $ r = mysql_query ("SELECT count (*) FROM user"); $ d = mysql_fetch_row ($ r); $ rand = mt_rand (0, $ d [0] - 1); $ r = mysql_query ("ODABERI korisničko ime IZ korisničkog imena LIMIT $ rand, 1");
Stoga odabirete slučajan broj manji od broja rezultata i koristite ga kao pomak u odredbi LIMIT.

20. Optimizirajte klauzulu WHERE


Ovo su neki savjeti za optimiziranje klauzule WHERE:
  • Uklonite nepotrebne zagrade. Na primjer:
 Od do5 I b = c I a = 5
  • COUNT (*) optimiziran je za vraćanje SELECT -a mnogo brže, sve dok je na stolu i bez korištenja WHERE. Na primjer:
 SELECT COUNT (*) FROM table.
  • The SQL_SMALL_RESULT opcija, može se koristiti s GRUPA PO ili RAZLIKUJE kako bi se pokazalo da je skup rezultata mali. U ovom slučaju, MySQL koristi vrlo brze privremene tablice za spremanje dobivene tablice umjesto korištenja sortiranja.

MySQL vodiči

wave wave wave wave wave