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.