NetHq Blog


A rossz legjobb kritikája az, ha megmutatjuk, hogyan kell jobban csinálni.

A Mysql gyorsítása - I rész

Nightvis, 2012.06.05 00:51
Minden weboldalnál fontos szempont a sebesség. Egy jó weboldal természetesen gyors is. A kérdés hogy, mit kell megtennünk azért hogy, hatékonyabban használjuk ki a meglévő erőforrásokat. Az egyik nagy kérdés hogy, honnan lehet megtudni mennyi ideig tart egy egy lekérdezés az adatbázisból.

Minden weboldalnál fontos szempont a sebesség. Egy jó weboldal természetesen gyors is. A kérdés hogy, mit kell megtennünk azért hogy, hatékonyabban használjuk ki a meglévő erőforrásokat. Az egyik nagy kérdés hogy, honnan lehet megtudni mennyi ideig tart egy egy lekérdezés az adatbázisból.

A mysql sebessége

Maga a mysql motor tartalmaz egy függvényt, aminek a segítségével sebességeket tudunk mérni. Ez a függvény a benchmakr(). Használata könnyü, az alábbi minta egy egyszerű benchmark függvényhívás.

SELECT BENCHMARK( 10000, 10 + 10 );

 

Ez a lekérdezés 10000 szer futtatja le a 10+10 matematikai műveletet. Vegyük észre hogy, jelen lekérdezésben a teljes mysql szerver sebességét vizsgáltuk meg. Fontos megjegyezni azt is hogy, ezt nem csak a mysql consolejából futtathatjuk. Phpmyadmin esetén az sql menüpontba bemásolva szintén lefut. A függvény visszatérési értéke egy nullás státuszkód lesz, illetve egy futási idő.

A mysql lekérdezések sebessége

A fenti példa segítségével már könnyen készíthetünk lekérdezéseket vizsgáló függvényhívásokat. Tegyük fel hogy, szeretnénk megtudni milyen gyorsan fut le a mysql szerveren egy teljes táblát érintő lekérdezés. A függvényhívás valahogy így nézne ki.

SELECT BENCHMARK('100','SELECT * FROM user');

 

Itt egymás után 100 szor futtatjuk le a teljes lekérdezést.  Itt már láthatjuk hogy, sokkal célirányosabb lekérdezések sebességének a lekérdezése sem megterhelő feladat. 

Táblamotorok avagy MyISAM vs InnoDB

Sokszor felmerül a kérdés hogy mely tárolási eljárással rögzítsük adatainkat a mysql-ben. Erre nincs kőbe vésett szabály, viszont a választásnál érdemes szem előtt tartani pár szempontot.  A myISAM tároló motor egyik nagy előnye hogy, adatmódosítások esetén gyors illetve támogatja a fulltext típusú mezők indexelését is. Ha olyan tábláról beszélünk ahol a módosítások gyakoriak, pl DELETE vagy UPDATE, akkor célszerű lehet ezt használni. Az InnoDB segítségével ellenben nagyobb sebességre tehetünk szert. Támogatja a tárolt eljárásokat is, viszont a fulltext mezőket nem lehet benne indexelni. Ha kapcsolt táblákat akarunk használni idegen kulcsokkal, akkor is az innoDB tároló motorra lesz szükségünk. A döntés tehát a miénk, viszont célszerű úgy alakítani a tábla struktúrát hogy, az egymáshoz szorosan kapcsolatban álló táblák tároló motorja ne térjen el egymástól. Ez nem szabály, így nem kötelező betartani, viszont a Backupolásnál érhetnek minket kellemetlen meglepetések a nagyon vegyes struktúra esetén.

Hatékony mysql lekérdezések

Sokan úgy gondolják hogy, a mysql sebességének javítása csak egyedi technikákkal érhető el. Ez nem minden esetben van így. Kezdjük az alapoktól, vagy is optimalizáljuk a lekérdezéseket. Mit is jelent ez? Az alábbi pár pont sokat segíthet a sebesség növekedésekben.

a.Lehetőleg ne használjuk a SELECT * lekérdezéseket, csak azokat a mezőket kérdezzük le amire ténylegesen szükségünk is van.

b.Tagoljuk a lekérdezésünket. Vagy is vezessük be a limit záradékot. Lapozó esetében már találkozhattunk a LIMIT záradékkal, de nem csak ott lehet hasznos számunkra.

c.Alkalmazzunk indexeket.

d.Csökkentsük tovább a lekérdezett adatmennyiséget. A WHERE záradék tökéletesen alkalmas erre. Pl.: Dátumok alapján csak az utolsó 30 nap adata.

Mysql mezők indexelése

Az indexelés sokat segít az optimális sebesség elérésében. Használata egyszerűm phpmyadminba egy kattintással indexet állíthatunk be egy-egy mezőnkre.  De mit is jelent az indexelés? Egy egyszerű példa. Tegyük fel hogy, van egy felhasználókat tartalmazó táblánk. Szeretnénk egy adott felhasználóra vonatkozó adatokat megkapni, lehetőleg a leggyorsabban. Szóval a felhasználók alapvető adatai egy táblában vannak tárolva, miközben a részletes adatok szintén egy másik táblában. Hogyan is kérdezzük le Pista adatait?

SELECT ID FROM felhasznalok WHERE email = 'pista@pista.hu';

 

Alap esetben a mysql végigjárja a tábla minden sorát. Ha az email mezőn viszont index van, akkor ez a művelet radikálisan javítható. Villámgyorsan megkapjuk az adott ID-t amivel már bogarászhatunk a másik táblában. Ez egy sok ezer soros táblában érezhető változást eredményez. Fontos megjegyezni hogy, az indexelés csak a SELECT utasításokat fogja gyorsítani. 

A Mysql segít az index választásban?

Nem tennénk fel ezt a kérdést, ha a válasz nemleges lenne. Tehát a mysql segít nekünk eldönteni hogy, mit állítsunk indexnek. Erre használatos az EXPLAIN. Vegyük példának a fenti lekérdezésünket. 

EXPLAIN SELECT ID FROM felhasznalok WHERE email = ’pista@pista.hu’;

 

Az eredményhalmaz tartalmaz néhány fontosabb adatot, amit érdemes lehet megvizsgálni.

Possible Keys: A lehetséges indexek ezt a mysql ajánlja.

Keys: Az indexek (vagy csak 1) amit valójában felhasználunk már.

KeyLen: Az index hossza.

Rows: Sorok száma a lekérdezésben, ha túl nagy akkor komolyan kell foglalkozni a kéréssel. Ellenőrizzük, hogy a Rows mennyi sorra hivatkozik. Ha itt túl nagy szám található, az azt jelenti, hogy a motornak sok sort kell átvizsgálnia az eredmény eléréséhez, és ezt feltételezhetően nem megfelelő index, vagy hiányzó index okozza.

Extra: Extra információk: Ez nagyon fontos lehet. Az Extra tartalmazza, hogy készült e ideiglenes tábla a lekérdezés folyamán (Using temporary), vagy esetleg a sorba rendezést indexek figyelembe vétele nélkül végezte (Using fileshort). Ez akkor érdekes, ha túl nagy a rows.

Összegzés

Áttekintettük a mysql táblák gyorsításával kapcsolatos alapvető műveleteket és fogalmakat. A továbbiakban foglalkozni fogunk a tábla kapcsolásokkal illetve nézetek és a tárolt eljárásokkal is. 

 

Tartalom közösségi megosztása: