20 de tipuri de sfaturi pe blog-ul bun pentru MySQL

1. interogări Optimizați pentru cache interogare

Cele mai multe servere MySQL interogare cache este activată. Una dintre cele mai bune modalități de a îmbunătăți performanța - oferă doar cache-ul bazei de date în sine. Atunci când o cerere se repetă de mai multe ori, rezultatul este luat din memoria cache, care este mult mai rapid decât accesul direct bazei de date.
Problema principală este că mulți oameni folosesc pur și simplu interogările care nu pot fi zakeshirovanny:

  1. // interogare nu va fi în cache
  2. $ R = mysql_query ( "SELECT nume FROM user WHERE signup_date> = CURDATE ()");
  3. // și așa va fi!
  4. $ Astăzi = data ( "Y-m-d");
  5. $ R = mysql_query ( "SELECT nume utilizator utilizator WHERE signup_date> = '$ azi'");

Motivul este că funcția de utilizare CURDATE () în prima interogare. Acest lucru este valabil pentru toate funcțiile ca acum (), RAND (), și altele, din care rezultatul este non-determinist. În cazul în care rezultatul funcției se poate schimba, MySQL nu cache această solicitare. În acest exemplu, este posibil să se prevină data de calcul pentru interogarea.

2. Utilizați EXPLICAȚI la interogările SELECT

Utilizarea EXPLAIN. puteți vedea exact cum MySQL efectuează cererea. Acest lucru poate ajuta să scapi de punctele slabe ale performanței și a altor probleme din interogare sau structură de tabel.
Rezultatul EXPLICAȚI va arăta care indexurile sunt utilizate ca selectate și sortate tabele, etc.
Ia interogare SELECT (poate fi dificil, cu asociațiile) și se adaugă la partea de sus a cuvântului cheie EXPLAIN. Pentru a face acest lucru, puteți utiliza phpMyAdmin. Ca rezultat, veți obține o masă foarte interesant. De exemplu, să presupunem că am uitat să adăugați un index la un tabel, care este implicată în asocierea:

După adăugarea indexului unui group_id domeniu:

Acum, în loc de 7883 linii sunt selectate numai 9 și 16 rânduri de două mese. Multiplicarea toate numerele din coloana rânduri dă numărul este direct proporțională cu performanța interogărilor.

3. LIMIT 1, atunci când aveți nevoie de o singură linie

Uneori, referindu-se la masă, știi că ai nevoie doar de o singură direcție. De exemplu, pentru a obține un șir unic sau pur și simplu să verifice dacă există înregistrări care satisfac interogarea unde.
În acest caz, adăugând LIMIT 1 pentru interogarea dvs. va fi optimă. Astfel, baza de date se va opri înregistrările de eșantionare după ce a constatat prima, mai degrabă decât pentru a selecta întregul tabel sau index.

4. Index domeniile, care sunt în căutarea

Indicele nu este doar o cheie primară sau unică. Este la fel ca orice coloane din tabel pe care le utilizați pentru a căuta, și pot fi indexate.

După cum puteți vedea, această regulă se aplică și la o parte dintr-un șir de caractere, de exemplu - «last_name LIKE a%». Când căutați de la începutul șirului, MySQL utilizează indexul acestei coloane.
De asemenea, trebuie să înțeleagă că acest lucru nu funcționează pentru expresii regulate. De exemplu, atunci când căutați un cuvânt (de exemplu, «UNDE POST_CONTENT LIKE«% mere%»»), apoi un index obișnuit va fi nici bun. Ar fi mai bine să se folosească de căutare full-text, sau pentru a crea propriul sistem de indexare.

5. Index câmpul să combine și să le utilizeze pentru aceleași tipuri de coloane

Dacă cererea dumneavoastră conține o mulțime de mese unite, trebuie să indice domeniile în ambele tabele sunt folosite pentru a combina. Acest lucru va afecta modul în care MySQL face asociații de optimizare interne.
Doar aceste coloane trebuie să fie de același tip. De exemplu, dacă combinați o coloană DECIMAL cu coloana INT de la un alt tabel, MySQL nu va fi capabil să utilizeze cel puțin unul dintre indicii. Chiar și codificarea caracterelor trebuie să fie de același tip pentru coloanele de coarde.

  1. // eșantion de societăți în starea utilizatorului
  2. $ R = mysql_query ( „SELECT COMPANY_NAME de la utilizatori
    STÂNGA ÎNSCRIEȚI companii de pe (users.state = companies.state)
    UNDE users.id = $ user_id „);
  3. // ambele coloane trebuie să fie indexate, starea
  4. // ambele trebuie să aibă același tip de date și codificarea caracterelor
  5. // altfel MySQL va face o prelevare de probe completă a acestor tabele

6. Nu utilizați ORDER BY RAND ()

(Aceasta se referă la selectarea unei singure linii. Nota traducătorului)

Este unul dintre acele lucruri care arata foarte bine la prima vedere, dar mulți programatori care încep se încadrează pentru ea. Nu vă puteți imagina cum apar blocajele de performanță dacă îl utilizați într-o interogare.
Dacă doriți cu adevărat o ordine aleatorie a rândurilor din interogare, atunci există modalități mai bune de a face acest lucru. Desigur, acest lucru va duce la un cod suplimentar, dar va scăpa de blocajele de performanță, care se vor micșora exponențial cu o creștere a datelor. Problema care se va efectua MySQL RAND () (care este sarcina de pe procesor) pentru fiecare linie de sortare prin emiterea de un singur rând.

Deci, alegeți un număr aleator care este mai mic decât numărul de rânduri și să-l utilizați pentru a părtinire LIMIT.

7. Evitați SELECT *

Mai multe date sunt citite din tabel, mai lent cererea. Aceasta maximizează depozitul de date. De asemenea, atunci când serverul de bază de date este instalat separat de web-server, va fi o lungă întârziere atunci când transferul de date prin rețea.
Prescrierea exact ce coloane din interogarea care aveți nevoie - un obicei bun.

// nu este foarte bun:
$ R = mysql_query ( «SELECT * FROM user WHERE user_id = 1" );
$ D = mysql_fetch_assoc ($ r);
echo «bun venit»;

// mai bine:
$ R = mysql_query ( «SELECT nume FROM user WHERE user_id = 1" );
$ D = mysql_fetch_assoc ($ r);
echo «bun venit»;

// diferența este mai semnificativă atunci când seturi mari de date.

8. Încercați întotdeauna să creeze câmpul ID

9. Utilizarea ENUM în loc de VARCHAR

ENUM - un tip foarte rapid și compact de câmp. Valorile stocate acolo doar ca TINYINT, dar sunt afișate ca un câmp șir. Acest lucru face indispensabil în unele cazuri.
Dacă aveți un domeniu în care este un set bine definit de valori, utilizați ENUM în loc de VARCHAR. De exemplu, în cazul în care există un «statut» câmp, valoarea sa poate fi «activ», «inactive», «în curs», «expirat» etc.
Puteți obține chiar și de «consiliu» MySQL cu privire la modul de a reconstrui masa. Dacă aveți un câmp VARCHAR, MySQL poate oferi să-l înlocuiască cu ENUM. În acest scop, ANALIZAȚI PROCEDURA (). descrise mai jos.

10. Utilizați sfaturile din PROCEDURA ANALIZAȚI ()

Rețineți că acestea sunt doar sugestii. Dacă adăugați mai multe înregistrări, acestea să nu mai fie relevante. În cele din urmă, vă decideți - să le folosească sau nu.

11. Utilizarea NOT NULL, dacă este posibil

Dacă există un motiv specific de a utiliza NULL - îl folosiți. Dar înainte de asta, intreaba-te - există o diferență între un șir gol și NULL (pentru INT - 0 sau NULL). Dacă aceste motive nu sunt prezente, utilizați NOT NULL.
NULL ocupă mai mult spațiu, și, în plus, complică comparația cu câmpul. Evitați să-l dacă este posibil. Cu toate acestea, există motive întemeiate de a utiliza NULL, acest lucru nu este întotdeauna un lucru rău.
Din MySQL documentație:
«Coloane NULL ocupă mai mult spațiu în înregistrarea, din cauza necesității de a sublinia că este NULL. Pentru tabelele InnoDB, fiecare câmp NULL bit suplimentar este un 1, care este rotunjit la cel mai apropiat octet. "

12. Declarații preparate

  1. // crea o declarație pregătită
  2. în cazul în care ($ STMT = $ mysqli -> pregăti ( "? SELECT nume de utilizator la utilizator, în care statul ="))
  3. // Valoarea bind
  4. $ STMT -> bind_param ( "e" $ de stat.);
  5. // face
  6. $ STMT -> execute ();
  7. // leagă rezultatul
  8. $ STMT -> bind_result ($ username);
  9. // obține datele
  10. $ Stmt -> fetch ();
  11. printf ( "% s este de la% s \ n" $ username $ de stat..);
  12. $ Stmt -> close ();
  13. >

13. interogări netamponată

De obicei, ceea ce face o cerere, script-ul se oprește și așteaptă rezultatul punerii sale în aplicare. Puteți schimba acest lucru utilizând interogări netamponate.
O descriere bună acolo mysql_unbuffered_query () în documentația:

«Mysql_unbuffered_query () trimite o interogare SQL la MySQL, fără preluarea și tamponarea automat rândurile de rezultate, ca delaetmysql_query (). Pe de o parte, acest lucru economisește o cantitate considerabilă de memorie pentru SQL-interogări care produc seturi de rezultate mari. Pe de altă parte, puteți începe să lucrați cu rezultatul stabilit imediat după prima serie: nu este nevoie să așteptați până când complet SQL-interogare "

Cu toate acestea, există anumite limitări. Va trebui să citească toate înregistrările sau pot provoca mysql_free_result () înainte de a putea face o altă cerere. Deci, nu se poate utiliza mysql_num_rows () sau mysql_data_seek () pentru rezultatul funcției.

14. A se păstra IP în INT UNSIGNED

15. Tabelele dimensiune fixă ​​(statică) - mai rapid

În cazul în care fiecare coloană într-un tabel este o dimensiune fixă, un astfel de tabel este numită „statică“ sau „dimensiune fixă“. coloanele EXEMPLU nu sunt de lungime fixă: VARCHAR, TEXT, BLOB. Dacă includeți un tabel de un astfel de domeniu, acesta va înceta să fie stabilită și MySQL vor fi procesate într-un mod diferit.
Utilizarea unor astfel de tabele crește eficiența, astfel cum MySQL poate vizualiza intrările în ele mai repede. Atunci când este necesar să selectați rândul corespunzător din tabel, MySQL poate calcula rapid poziția. În cazul în care o dimensiune de înregistrare nu este fix, acesta este căutat de index.
De asemenea, este mai ușor să cache aceste tabele și de a restabili baza de date după căderea. De exemplu, dacă conversia VARCHAR (20) până la CHAR (20), înregistrarea va dura până la 20 bytes, indiferent de conținutul său real.
Folosind metoda de „separare verticală“, puteți face coloane cu rânduri de lungime variabilă într-un tabel separat.

Separarea 16. Vertical

17. interogări separate mari de inserare și ștergere

Dacă aveți nevoie pentru a face o cerere mare pentru a șterge sau insera date, trebuie să avem grijă să nu perturbe aplicația. Efectuarea unei interogări de mare poate bloca o masă și pot cauza disfuncționalități întregii aplicații.
Apache poate rula mai multe procese concurente simultan. Deci, funcționează mai eficient atunci când script-urile sunt executate cât mai repede posibil.
Dacă blocați tabelul pentru o perioadă lungă de timp (de exemplu, 30 de secunde sau mai mult), apoi un trafic mare site-ul, cele mai multe dintre toate procesele și interogări pot apărea, ceea ce poate duce la munca lentă a site-ului, sau chiar un accident de server.
Dacă aveți astfel de anchete, utilizați LIMIT, pentru a le executa în loturi mici.

18. coloane puțin mai repede

Pentru baza de date pentru a lucra cu hard disk-ul este, probabil, cel mai slab punct. de înregistrare mic și compact este de obicei mai bine în termeni de performanță, pentru că reduce lucrul cu discul.
Documentația pentru MySQL are o listă de cerințe pentru depozitul de date pentru toate tipurile de date.
În cazul în care masa ta va stoca siruri de caractere mici, nu are nici un sens pentru a face tipul de cheie primară INT, va fi posibil să se facă mai bine MEDIUMINT, SMALLINT sau TINYINT. Dacă nu aveți timp pentru a menține, în loc de a folosi data de DATETIME.
Cu toate acestea, să fie atent că nu ar funcționa cum să Slashdot.

19. Alegeți tipul corect de tabel

Cele două tipuri principale de mese - MyISAM și InnoDB, fiecare are propriile sale argumente pro și contra.
InnoDB este bun citește din tabel o mulțime de date, dar este rău pentru înregistrare. Chiar dacă schimbați doar o singură linie, a blocat întregul tabel, și nici un proces nu poate citi nimic de la ea. InnoDB efectua rapid interogări cum ar fi SELECT COUNT (*).
În InnoDB mecanism mai complex de stocare a datelor, și poate fi mai lentă decât InnoDB, pentru aplicații mici. Dar suportă blocare rând, ceea ce este mult mai eficient atunci când scalate. De asemenea, este susținută de unele caracteristici suplimentare, cum ar fi operarea tranzacției.
Mai mult:
InnoDB Motor de stocare
InnoDB Motor de stocare

20. ispolzute ORM

Folosind ORM, puteți obține ceva de lucru de optimizare. Tot ce se poate face cu ajutorul ORM, se poate face manual. Dar este nevoie de mai multă muncă și un nivel mai ridicat de cunoștințe.
ORM este remarcabil pentru datele de încărcare „leneș“. Acest lucru înseamnă că datele de eșantionare după cum este necesar. Dar trebuie să fii atent, deoarece aceasta poate duce la apariția unor numeroase interogări de mici, având ca rezultat o performanță slabă.
ORM pot combina, de asemenea, mai multe interogări în pachete în loc să trimită fiecare separat.
Care este ORM tau preferat pentru PHP - Doctrina. Am scris un articol despre cum se instalează Doctrina în CodeIgniter.

21. Fii atent cu conexiuni persistente

conexiuni persistente sunt proiectate pentru a reduce costul de a stabili comunicarea cu MySQL. Atunci când se stabilește conexiunea, rămâne deschisă după finalizarea scenariului. Data viitoare că script-ul va folosi aceeași conexiune.
mysql_pconnect () în PHP
Dar sună bine în teorie. Din experiența mea personală (și experiența altora), utilizarea de această caracteristică nu este justificată. Vei avea o problemă serioasă cu restricția privind numărul de conexiuni, memorie, și așa mai departe.
Apache creează multe fluxuri paralele. Acesta este principalul motiv pentru care conexiunile persistente nu funcționează la fel de bun ca ne-ar dori. Înainte de a utiliza mysql_pconnect (), consultați cu administratorul de sistem.

Vă mulțumesc poate, prin formularul din dreapta „Doneaza“. )

Pentru a vă recompensa prin intermediul formularului de pe dreapta „Doneaza“. )

articole similare