SQL lekérések csökkentése
Sziasztok!
Le szeretném csökkenteni egy oldalon az SQL lekéréseket. Ti hogy oldanátok ezt meg?
Összegzem milyen lekéréseim lennének:
Állandó elemek:
- új munkamenet folyamat regisztrálása (új látogatónként)
- meglévő munkamenet folyamat dátumának módosítása (mindig)
- a honlapon lévő vendégek + felhasználók listája (mindig)
- aktuális hirdetés lekérdezése (mindig)
- aktuális apróhirdetés lekérdezése (mindig)
(opcionális)
- felhasználó név + jelszó ellenőrzése (mindig)
- felhasználó adatának a lekérdezése (alkalmanként)
- felhasználó adatának módosítása (alkalmanként)
- felhasználó utolsó bejelentkezési dátumának módosítása (mindig)
Tartalom: (pl.: fórum)
- fórum cím lekérdezése
- fórum téma lekérdezése
- témának megfelelő összes fórumi hozzászólások számának lekérdezése (lapozgatáshoz)
- fórumi hozzászólások (limit-tel) lekérdezése
Hirtelen most ennyi jutott eszembe, de nyilván az összes szolgáltatással el lehet így játszani. Ez a legjobb esetben is 10 SQL kérés minden oldal letöltésekor, és a látogatottság mérőmodult (+2) ki is akarom szedni, ezért nem is számoltam bele.
Tehát hol lehetne itt spórolni?
A másik kérdésem, ha a php futatása során már megállapítottam, hogy a jelszó és a felhasználó név párosítás jó, akkor a továbbiakban abban már megbízhatók? (Pl.: globális változó $hiteles=true;) Vagy minden egyes akciónál újra ellenőrizzem le?
Előre is köszönöm a segítségeteket.
■ Le szeretném csökkenteni egy oldalon az SQL lekéréseket. Ti hogy oldanátok ezt meg?
Összegzem milyen lekéréseim lennének:
Állandó elemek:
- új munkamenet folyamat regisztrálása (új látogatónként)
- meglévő munkamenet folyamat dátumának módosítása (mindig)
- a honlapon lévő vendégek + felhasználók listája (mindig)
- aktuális hirdetés lekérdezése (mindig)
- aktuális apróhirdetés lekérdezése (mindig)
(opcionális)
- felhasználó név + jelszó ellenőrzése (mindig)
- felhasználó adatának a lekérdezése (alkalmanként)
- felhasználó adatának módosítása (alkalmanként)
- felhasználó utolsó bejelentkezési dátumának módosítása (mindig)
Tartalom: (pl.: fórum)
- fórum cím lekérdezése
- fórum téma lekérdezése
- témának megfelelő összes fórumi hozzászólások számának lekérdezése (lapozgatáshoz)
- fórumi hozzászólások (limit-tel) lekérdezése
Hirtelen most ennyi jutott eszembe, de nyilván az összes szolgáltatással el lehet így játszani. Ez a legjobb esetben is 10 SQL kérés minden oldal letöltésekor, és a látogatottság mérőmodult (+2) ki is akarom szedni, ezért nem is számoltam bele.
Tehát hol lehetne itt spórolni?
A másik kérdésem, ha a php futatása során már megállapítottam, hogy a jelszó és a felhasználó név párosítás jó, akkor a továbbiakban abban már megbízhatók? (Pl.: globális változó $hiteles=true;) Vagy minden egyes akciónál újra ellenőrizzem le?
Előre is köszönöm a segítségeteket.
$_SESSION['hiteles'] = true
Elküldi a név-jelszó párost, leellenőrzöd, és, ha stimmel, akkor az adatait sessionbe teszed. A későbi kérésekkor már nyugodtan használhatod ezt. (Esetleg érdemes megnézni az erről szóló Weblabor cikket, ha nem bízol eléggé a beépített munkamenetkezelésben.)
Pár ötlet
- fórum téma lekérdezése
Esetleg ezeket össze lehet vonni valamilyen JOIN műveletté, azzal már spórolsz egy kérést.
- új munkamenet folyamat regisztrálása (új látogatónként)
- meglévő munkamenet folyamat dátumának módosítása (mindig)
Ezt én úgy szoktam, hogy először megpróbálom frissíteni, ha nem található, akkor beszúrok egyet. Csak arra vigyázni kell, hogy a mysql_affected_rows() a ténylegesen módosíott sorokat adja vissza, szoval, ha egy felhasználó ideges, és folyamatosan nyomkodja az F5-t, akkor elhet hogy morcos lesz rá. (-> mysql_info()).
Ezen kívül esetleg valamilyen cachelési módszert tudnék még javasolni, például hírek kiíratása fájlba, memcached -be, stb.
Gyorstárazás, JOIN, pici gondolkodás
- meglévő munkamenet folyamat dátumának módosítása (mindig)
- felhasználó adatának a lekérdezése (alkalmanként)
- felhasználó adatának módosítása (alkalmanként)
- felhasználó utolsó bejelentkezési dátumának módosítása (mindig)
Ezeket ha ügyes vagy akkor 1 lekérdezésbe gyúrhatod. A felhasználó utolsó bejelentkezésének dátuma meg fog egyezni a session indításának idejével.
- a honlapon lévő vendégek + felhasználók listája (mindig)
- aktuális hirdetés lekérdezése (mindig)
- aktuális apróhirdetés lekérdezése (mindig)
Mit jelent az aktuális? Napi, óránkénti, percenkénti frissítést? Ha nem minden pillanatban változnak ezek akkor tudsz gyorstárazni, így a formázás költségét megspórolhatod.
(opcionális)
- felhasználó név + jelszó ellenőrzése (mindig)
ez felesleges, és kivitelezhetetlen is, vagy mindig bekéred a név jelszó párost?
Tartalom: (pl.: fórum)
- fórum cím lekérdezése
- fórum téma lekérdezése
- témának megfelelő összes fórumi hozzászólások számának lekérdezése (lapozgatáshoz)
- fórumi hozzászólások (limit-tel) lekérdezése
Itt is gyorstárazással sokat dobhatsz az ügyön, hisz csak akkor kell kidobnod a gyorstár tartalmát, ha valaki hozzászólt.
pp
JOIN, USING, UNION ???
Olvastam egy cikket, de nem világos teljesen, hogy miért jobb a második megoldás, ha az eredményen nem változtat.
pp: Hogy tudom egybe gyúrni? Egy lekérdezéssel lehet több adatot is módosítani? (Az egy lekérdezés az ugye az első pontosvesszőig tartó parancs?)
Nem tudok egyszerűen válaszolni a kérdésedre
Pontatlanul fogalmaztam. Egy lekérdezéssel (update) egy tábla mezőit tudod változtatni, de nem biztos, hogy szükséges a user tábla utolso_aktivitas és a session tábla utolso_aktivitas mezőjét külön külön updete-lned, hisz valószínűleg a session táblában tárolod azt, hogy melyik felasználóhoz tartozik a session (user_id pl). Ekkor a két mező adata meg fog egyezni, tehát felesleges külön tárolnod.
Jelentős sebesség növekedést lehet elérni, ha az egész user objektumodat a felhasználó különböző adataival, jogaival, mindennel együtt serializálva tárolod az adatbázisba, kvázi gyorstárazod a felhasználóhoz tartozó adatokat. Ilyenkor nagymértékben elbonyolítod a dolgodat, hisz figyelned kell arra, hogy ha a felhasználó adataiban változás történi, akkor azt mindig újra töltsed.
De a téma ugye az volt, hogy hogyan tudod csökkenteni az adatbázis műveleteket, hát úgy, hogy csökkented őket ;) a feleslegeseket elhagyon, amit lehet összevonsz és gyorstárazol.
Ajánlom keress rá az "adatbázis tervezés", "normál forma" "sql lekérés optimalizálás" "sql sebesség növelés" szókapcsolatokra. Fontos, hogy nem csak az adatbázis műveletek (mysql_query függvényhívások) számát kell csökkentened, hanem magukat az sql lekérdezéseket is optimalizálnod kell, valamint nem árt, ha az adatbázisod sem egy szemétdomb és van benne pár jól elhelyezett index ;)
mondjuk elsőre ezt találtam:
http://www.agt.bme.hu/szakm/adatb/adatb.htm
meg itt van ez is:
www.freeweb.hu/jataka/sala/sqlopt.pdf
Mivel elég általános kérdést tettél fel nehéz segíteni az elindulásban, de azért remélem sikerült.
pp
Köszönet
Igen, már tudom is, hogy fogom megoldani. A munkamenet függvényben tárolom a felhasználó nevet (mint eddig is), és a jelszót, amelyek csak akkor kerül be, ha hitelesítette magát (bejelentkezett). Tehát nem fogom minden egyes esetben leellenőrizni, csak ahol más jogosultság szükséges. A cookie-ba beteszem a felhasználó nevet, és a jelszót is szórva, ha előzőleg bejelölte a „jegyezz meg” stb. négyzetet.
Ha a munkamenet azonosító megérett a törlésre, vagy kijelentkezik, akkor a munkamenet alapján módosítom az utolsó bejelentkezés időpontját.
Gyorstárazás
Gyorsítótár egy módszer amit nem csak böngészők használn
Azért vettem példának a menüt, mert az általában jóval ritkábban változik, mint ahányszor megnézik. Tehát érdemes a hosszú összerakási időt megspórólni és kiváltani egy egyszerű lekérdezéssel.
Tehát a gyorstárazás az egy technika amivel gyorsítani tudjuk az adatok előállítását úgy, hogy ha már egyszer előállítottuk akkor eltároljuk és a lekérésekkor ezt a tárolt változatot adjuk vissza. Persze ezt a technikát csak körültekintően lehet használni, hisz számos olyan új kérdést vet fel a használata ami "normál" működésnél nem jönne elő.
Remélem érthető voltam ;))
Körültekintően ...
Például?
cache lejárata
Elévül az adata a cache-ben
Ez a probléma nem jön elő, ha nem használsz gyorsítótárat. Olyankor csak fogod és bedobod a megfelelő csoportba a juzert és már működik is minden.
Mivel a változtatás és a felhasználás két külön helyen van a kódban ezért mondom, hogy oda kell figyelni a használatra, és körültekintően kell használni.
konkurencia
Üdv,
Felhő
fájlba?
Úgy képzelem el, hogy fájlokba kiírom az adatokat, és azt csak egyszerűen beolvasnám. (include) Ha nem létezik a megadott fájl, akkor létre hozza. A webes felületről egy jelszóval tudnám törölni egyszerre mindegyiket. (Ha valaki megszerzi a jelszó, akkor mégse tud kárt okozni, csak maximum lassítani az oldal előállítását. De ezt persze úgyis naplózni fogom.) Ez a kézi megoldás. Az automatikus mondjuk, az lenne, hogy naponta egy időzített php program megnézi, hogy történt-e változás.
Ezeket csak azért írom le, hogyha valamit nagyon félreértelmezek, akkor tudjatok szólni. :-)