20 fajta blog jó tanácsot mysql

1. optimalizálása lekérdezéseket lekérdezés cache

A legtöbb MySQL szerver lekérdezés gyorsítótár engedélyezve van. Az egyik legjobb módja, hogy javítsa teljesítményét - csak biztosítja a gyorsítótár-adatbázis is. Ha egy kérelmet sokszor megismétlődik, az eredmény venni a cache, ami sokkal gyorsabb, mint a közvetlen adatbázis hozzáférést.
A fő probléma az, hogy sokan egyszerűen csak a lekérdezéseket, hogy nem lehet zakeshirovanny:

  1. // lekérdezés nem cache
  2. $ R = mysql_query ( "SELECT username FROM WHERE felhasználó signup_date> = CURDATE ()");
  3. // és így lesz!
  4. $ Ma = dátum ( "Y-m-d");
  5. $ R = mysql_query ( "SELECT username FROM WHERE felhasználó signup_date> = '$ a mai");

Ennek az az oka, hogy a használata CURDATE () függvény az első lekérdezés. Ez vonatkozik minden úgy működik, mint NOW (), RAND (), és mások, az eredmény, amely nem determinisztikus. Ha a függvény eredménye lehet változtatni, a MySQL nem gyorsítótár ezt a kérést. Ebben a példában, lehetséges, hogy megakadályozzák a számítás időpontja a lekérdezés.

2. Magyarázza meg SELECT lekérdezések

Használata megmagyarázni. láthatja, hogy pontosan hogyan MySQL teljesít a kérését. Ez segíthet megszabadulni a gyenge teljesítmény és egyéb problémák a lekérdezés vagy táblázat szerkezetét.
Eredmény MAGYARÁZZA megmutatja, hogy mely mutatókat használnak, mint a kiválasztott és rendezett táblázatok, stb
Vedd le SELECT lekérdezés (nehéz lehet, a szövetségek), és add, hogy a tetején a kulcsszó megmagyarázni. Ehhez használhatja phpmyadmin. Ennek eredményeként, akkor kap egy nagyon érdekes asztalra. Tegyük fel például, hogy elfelejtettem, hogy adjunk egy indexet a tábla, amely részt vesz az egyesület:

Az adagolás befejezése után az index mező group_id:

Most ahelyett, 7883 vonalak vannak kiválasztva csak a 9. és 16. sorok a két asztal. Megszorozzuk az összes számot a sorokban az oszlop száma egyenesen arányos a lekérdezések teljesítményét.

3. LIMIT 1, ha szüksége van egy sorban

Néha a táblázat, akkor tudja, hogy csak akkor kell egy adott vonalon. Például, hogy egy egyedi string vagy egyszerűen meglétének rekordok, amelyek megfelelnek a lekérdezés WHERE.
Ebben az esetben, hozzátéve LIMIT 1 a lekérdezés lesz optimális. Így az adatbázis leáll mintavételi bejegyzések megtalálása után az első, ahelyett, hogy a teljes tábla vagy index.

4. Index a mezőket, amelyeket keres

Az index nem csak egy elsődleges vagy egyedi kulcs. Ez csak, mint bármely oszlop a táblázatban, hogy használja keresni, és lehet indexelni.

Mint látható, ez a szabály vonatkozik a része egy string, például - «last_name LIKE»% a«». Ha keres elejétől a húr, MySQL használja az index ebben az oszlopban.
Azt is meg kell értenünk, hogy ez nem működik a reguláris kifejezések. Például, ha keres egy szót (pl «WHERE POST_CONTENT LIKE»% alma%«»), akkor egy közönséges index nem lesz jó. Jobb lenne, hogy használja a teljes szöveges keresést, vagy létrehozhat saját indexelő rendszert.

5. Index területén kombinálni, és használja őket az azonos típusú oszlopok

Ha az alkalmazás tartalmaz egy csomó összekapcsolt táblák, meg kell index mezők mindkét táblában használják, hogy összekapcsolják. Ez befolyásolja, hogy milyen MySQL-e a belső optimalizálás egyesületek.
Csak ezeket az oszlopokat kell az azonos típusú. Például ha össze decimális oszlopot INT oszlop egy másik tábla, MySQL nem fogja tudni, hogy legalább az egyik indexek. Még a karakterkódolást kell lennie az azonos típusú karakterlánc oszlopok.

  1. // minta vállalatok az állam a felhasználó
  2. $ R = mysql_query ( „SELECT FROM COMPANY_NAME felhasználók
    LEFT JOIN cégek (users.state = companies.state)
    WHERE users.id = $ user_id „);
  3. // mindkét oszlopot kell indexelni, az állami
  4. // mindketten meg kell egyeznie a adattípus és a karakterkódolás
  5. // egyébként MySQL fogja tenni a teljes mintavételi ezek a táblák

6. Ne használjon ORDER BY RAND ()

(Ez arra utal, hogy a kiválasztott egyetlen vonalon. A fordító megjegyzése)

Ez az egyik olyan dolog, hogy nagyon jól néz ki első pillantásra, de sok kezdő programozók tartoznak hozzá. El sem tudja képzelni, milyen teljesítmény szűk fordul elő, ha azt egy lekérdezés.
Ha szeretné, véletlenszerű sorrendben a sorok a lekérdezés, akkor vannak jobb módszerek csinálni. Persze, ez ahhoz vezet, hogy egy további kódot, de megszabadulni a teljesítmény szűk, ami zsugorodik exponenciálisan nőtt az adatokat. A probléma, hogy elvégzi a MySQL RAND () (amely a processzor terhelését,) minden sor válogató kiadásával egyetlen sorban.

Tehát úgy dönt, egy véletlen szám, amely kisebb, mint a sorok számát, és ez alapján elfogultság LIMIT.

7. Kerülje SELECT *

Minél több adatot olvasni a táblázatból, annál lassabb a kérést. Ez maximalizálja az adatok tárolására. Továbbá, ha az adatbázis szerver külön kell telepíteni a web-szerver lesz a késés, ha át adatokat a hálózaton keresztül.
Előírják, hogy pontosan mely oszlopokat a lekérdezés van szüksége - egy jó szokás.

// nem túl jó:
$ R = mysql_query ( «SELECT * FROM felhasználó, ahol user_id = 1" );
$ D = mysql_fetch_assoc ($ R);
echo «Welcome»;

// jobb:
$ R = mysql_query ( «SELECT felhasználónevét az felhasználó, ahol user_id = 1" );
$ D = mysql_fetch_assoc ($ R);
echo «Welcome»;

// különbség még jelentősebb, ha nagy adathalmazok.

8. Mindig próbáljuk megteremteni az azonosító mező

9. Az ENUM helyett VARCHAR

ENUM - egy nagyon gyors és kompakt típusú mező. Az értékek az ott tárolt ugyanolyan tinyint, de jelennek meg, mint egy szöveges mező. Ez elengedhetetlenné teszi, hogy az egyes esetekben.
Ha van egy olyan területen, amely egy jól meghatározott értékrend, használja ENUM helyett VARCHAR. Például, ha van egy mező «jogállás», értéke lehet «aktív», «inaktív», «függőben», «lejárt» stb
Akkor is kap a MySQL «tanács» hogy hogyan lehet felépíteni az asztalra. Ha van egy VARCHAR mező, MySQL nyújthat, hogy helyette ENUM. Erre a célra ELJÁRÁS felmérés (). az alábbiakban ismertetjük.

10. A tippeket ELJÁRÁS felmérés ()

Megjegyzendő, hogy ezek csak javaslatok. Ha hozzá több feljegyzések, ezek lehetnek már nem releváns. Végül úgy dönt, - használni őket, vagy sem.

11. A NOT NULL, ha lehetséges

Ha van egy konkrét oka, hogy NULL - használja. De előtte, kérdezze meg magától - van-e különbség egy üres karakterláncot és NULL (INT - 0 vagy NULL). Ha ezek az okok nem áll fenn, használja a NOT NULL.
NULL több helyet, sőt, megnehezíti az összehasonlítást a területen. Elkerülni, ha lehetséges. Mindazonáltal jó okunk van használni NULL, ez nem mindig rossz dolog.
A dokumentáció MySQL:
«NULL oszlopokat több helyet a rekord, mert az kell hangsúlyozni, hogy ez NULL. Mert InnoDB asztal, minden területen a NULL járulékos bit 1, amely felfelé kell kerekíteni a legközelebbi byte. "

12. előkészített utasításokat

  1. // Létrehozunk egy előkészített nyilatkozatot
  2. if ($ stmt = $ mysqli -> készíteni ( "SELECT username FROM felhasználó, ha az állami =?"))
  3. // kötődnek értéke
  4. $ STMT -> bind_param ( "s" $ állam.);
  5. // do
  6. $ STMT -> execute ();
  7. // kötődnek az eredmény
  8. $ STMT -> bind_result ($ username);
  9. // hogy az adatokat
  10. $ STMT -> fetch ();
  11. printf (. "% s% s \ n" $ felhasználónév $ állapotban.);
  12. $ STMT -> close ();
  13. >

13. pufferelt lekérdezések

Általában egy kérelmet, a forgatókönyvet megáll, és megvárja az eredménye annak végrehajtását. Meg lehet változtatni ezt a segítségével nem pufferelt lekérdezések.
Egy jó leírást ott mysql_unbuffered_query () függvény a dokumentációban:

«Mysql_unbuffered_query () elküldi az SQL-lekérdezést a MySQL nélkül beolvasása és tárolják az eredmény sorokat automatikusan, mint delaetmysql_query (). Egyrészt, ez ment egy jelentős mennyiségű memória SQL-lekérdezések termelnek nagy eredmény határozza meg. Másrészt, meg lehet kezdeni dolgozni az eredmény meg közvetlenül az első sorozat: nem kell várni, amíg a teljes SQL-lekérdezés "

Azonban vannak bizonyos korlátai. Meg kell olvasni az összes rekordot, illetve ne okozzon mysql_free_result (), mielőtt újabb kérelmet. Tehát nem lehet használni mysql_num_rows () vagy mysql_data_seek () a függvény eredménye.

14. Store IP unsigned int

15. táblázatokban rögzített méretű (statikus) - gyorsabb

Ha minden oszlop a táblázatban egy rögzített méretű, például egy táblázat az úgynevezett „statikus” vagy „rögzített méretű”. Példa oszlopok nincsenek fix hosszúságú: VARCHAR, TEXT, BLOB. Ha Ön is egy tábla egy ilyen területen, akkor már nem rögzített és MySQL kerül feldolgozásra eltérő módon.
Az ilyen táblák növeli a hatásfokot, mint MySQL megtekintheti a bejegyzéseket azokat gyorsabban. Amikor szükség van, hogy kiválassza a megfelelő sort a táblázat, MySQL gyorsan kiszámítja a pozícióját. Ha egy rekord méretű nem rögzített, akkor a keresett indexszel.
Ugyancsak könnyebb cache ezeket a táblákat, és visszaállítani az adatbázist bukása után. Például, ha átalakítani VARCHAR (20) CHAR (20), a rögzítési felveszi 20 byte, függetlenül annak tényleges tartalmát.
A módszer a „vertikális szétválasztás”, akkor lehet, hogy az oszlopok változó hosszúságú sorok külön táblázatban.

16. Függőleges elválasztás

17. Külön nagy lekérdezések beillesztése és törlése

Ha szükség van, hogy egy nagy kérés, hogy törölni vagy beszúrni adatokat, óvatosnak kell lenni, hogy ne zavarja a kérelmet. Elvégzése egy nagy lekérdezési blokkolhatja egy asztal és üzemzavart okozhat az egész alkalmazást.
Apache futhat több párhuzamos folyamatok egyszerre. Így hatékonyabban működik, ha scriptek végrehajtása a lehető leggyorsabban.
Ha lezárja az asztal hosszú ideig (pl 30 másodperc vagy több), akkor egy nagy telek forgalom, a legtöbb az összes folyamat és a lekérdezések is előfordulhat, ami oda vezethet, hogy a lassú munka a helyszínen, vagy akár egy szerver meghibásodása.
Ha van ilyen vizsgálatok, használja a határ, hogy végre őket, kis tételekben.

18. Kis oszlopokat gyorsabban

Az adatbázis dolgozni a merevlemez valószínűleg a leggyengébb pontja. Kicsi és kompakt felvétel általában jobb a teljesítmény szempontjából, mert csökkentse a munkát a lemezen.
A dokumentáció MySQL követelmények listáját az adattárház minden adattípusok.
Ha a tábla tárolja kis húrok, akkor nincs értelme csinálni az elsődleges kulcs típusa INT, akkor lehet, hogy jobb MEDIUMINT, smallint vagy tinyint. Ha nincs ideje, hogy használja DATE helyett DATETIME.
Azonban legyen óvatos, hogy nem fog menni, hogyan kell Slashdot.

19. Válassza ki a megfelelő típusú tábla

A két fő típusú táblák - MyISAM és InnoDB, mindegyiknek megvan a maga előnye és hátránya.
InnoDB jó olvas az asztalnál egy csomó adat, de ez rossz a rekordot. Még ha változtatni csak egy sort, blokkolta a teljes táblázatot, és nem a folyamat nem tud olvasni belőle semmit. InnoDB gyorsan végrehajtani lekérdezést, például SELECT COUNT (*).
InnoDB bonyolultabb adattároló rendszer, és ez lehet a lassabb InnoDB, kisebb alkalmazásokhoz. De támogatja a sor zár, ami hatékonyabb, ha pikkelyes. Ez is alátámasztja néhány további funkciók, mint például a működését a tranzakciót.
tovább:
InnoDB Storage Engine
InnoDB Storage Engine

20. ispolzute ORM

Segítségével ORM, akkor egy kis optimalizálás munkát. Minden, ami történhet az ORM, manuálisan végezhető. De ez több munkát igényel, és a magasabb szintű tudás.
ORM figyelemre méltó az a „lusta” az adatok betöltése. Ez azt jelenti, a minta adatok szükség. De óvatosnak kell lenni, mert ez vezethet a kialakulásához sok kis lekérdezések, ami a rossz teljesítményt.
ORM is egyesítsen lekérdezések csomagok küldése helyett az egyes külön-külön.
Mi a kedvenc ORM PHP - Tan. Írtam egy cikket arról, hogyan kell telepíteni Doktrínális CodeIgniter.

21. Legyen óvatos állandó kapcsolatok

Az állandó kapcsolatok célja, hogy csökkentse a költségeit kommunikáció létesítéséhez MySQL. Ha a kapcsolat létrejött, továbbra is nyitott befejezése után a forgatókönyvet. A következő alkalommal, hogy a szkript fogja használni ugyanazt a kapcsolatot.
mysql_pconnect () PHP
De jól hangzik elméletben. Az én személyes tapasztalat (és mások tapasztalatai), az használja ezt a funkciót nem indokolt. Lesz egy komoly probléma a korlátozás a kapcsolatok számát, a memória, és így tovább.
Apache, ami sok párhuzamos stream. Ez a fő oka annak, hogy tartós kapcsolat nem működik olyan jól, mint azt szeretnénk. Használat előtt mysql_pconnect (), forduljon a rendszergazdához.

Köszönöm akkor az űrlapot a jobb „adomány”. )

Ahhoz, hogy fizesse meg a következő űrlap a jobb oldalon „adomány”. )

Kapcsolódó cikkek