Autor Zpráva
arikurumo
Profil *
Zdravím.
Mám jednu otázku ohľadom optimalizácie php kódu.
Čo je rýchlejšie a lepšie? Zadávať požiadavky do MySQL
mysql_query ('SELECT * FROM tabulka WHERE meno="Miro"')
mysql_query ('SELECT * FROM tabulka WHERE meno="Fero"')

alebo radšej načítať z DB celú tabuľku do premennej php (napr. array) a potom ju spracovávať tak (napr. array_search())?
Rád sa nechám trochu poučiť. Dík.
Alphard
Profil
where meno in ('Miro', 'Fero')
arikurumo
Profil *
Alphard:
díky za odpoveď. ale nemal som na mysli tento konkrétny príklad.
skôr som chcel vedieť či časté požiadavky do MySQL nespomaľujú priebeh skriptu.
či nieje výhodnejšie (rýchlejšie) načítať celú table 1x do premennej a potom už
pracovať v php len s tou premennou.
dík.
AM_
Profil
V Tom, co Alphard napsal, je ukryta celá odpověď :) efektivní je vymyslet dotaz tak, aby ses v MySQL zeptal jen jednou, ale zároveň vrácená data byla v takovém stavu, aby jsi s nimi už v PHP nemusel provádět zbytečně další operace a aby se dotazem nevracela zbytečná data.
//špatně, zbytečně dva dotazy
$miro = mysql_query ('SELECT * FROM tabulka WHERE meno="Miro"')
$fero = mysql_query ('SELECT * FROM tabulka WHERE meno="Fero"')
$miro = mysql_fetch_assoc($miro);
$fero = mysql_fetch_assoc($fero);

//špatně, nezajímá nás celá tabulka a zbytečně dlouho potrvá cyklus
$nekdo = mysql_query ('SELECT * FROM tabulka')
while ($osoba = mysql_fetch_assoc($nekdo)){
  if ($osoba ['meno'] == 'fero'){
    $fero = $osoba;
  }
  if ($osoba ['meno'] == 'miro'){
    $miro = $osoba;
  }
}

//správně, efektivní (stejný cyklus, ale projde se jen 2x, víc toho databáze nevyplivne)
mysql_query ("SELECT * FROM tabulka where meno in ('Miro', 'Fero')")
while ($osoba = mysql_fetch_assoc($nekdo)){
  if ($osoba ['meno'] == 'fero'){
    $fero = $osoba;
  }
  if ($osoba ['meno'] == 'miro'){
    $miro = $osoba;
  }
}

Ve složitějších případech je někdy náročné vymyslet opravdu efektivní dotaz, ale to je nevyhnutelná práce, pokud chceš psát efektivní programy. A vyžaduje to dobrou znalost SQL jazyka nebo alespoň ochotu vždy dohledat, jestli na danou problematiku v SQL není nějaká konstrukce, která by vrátila přijatelný výsledek; většinou je.
arikurumo
Profil *
takže čisto len pre rýchlosť spracovania je
mysql_query ("SELECT * FROM tabulka where meno in ('Miro', 'Fero')")
while ($osoba = mysql_fetch_assoc($nekdo)){
  if ($osoba ['meno'] == 'fero'){
    echo $osoba;
  }
  if ($osoba ['meno'] == 'miro'){
    echo $osoba;
  }
}

rýchlejšie ako
$miro = mysql_query ('SELECT * FROM tabulka WHERE meno="Miro"')
$fero = mysql_query ('SELECT * FROM tabulka WHERE meno="Fero"')
$miro = mysql_fetch_assoc($miro);
echo $miro["meno"];
$fero = mysql_fetch_assoc($fero);
echo $fero["meno"];

je tak?
a napadla ma ešte jedna vec (ide o čistú teóriu).
napr. na prvej stránke skriptu potrebujem vypísať tieto mená a keď prejdem na ďalšiu tak tam tiež.
1. buď to spravím na každej stránke MySQL dotazom (where meno in())
2. alebo mená načítam na prvej stránke do $_SESSION poľa a na ďalšej ich vypíšem cez for()... (alebo foreach)
druhý spôsob by mohol byť podľa mňa rýchlejší, nie?
mattyZEM
Profil
ber v potaz že se tato proměnná může měnit (nevím jak u tebe, třeba u systému kde můžou uživatelé něco dělat a tím pak změní data v sql), pak by jsi nemohl zjistit aktuální informace. Pokud by jsi to ale vážně chtěl takto udělat, použij SESSIONS, COOKIES nebo něco takového.

Co nejméně příkazů, to ano, ale zase za jakou cenu? Popřemýšlej nad tím co chceš, pak uvažuj čeho se můžeš vzdát, co můžeš ukládat do souborů a co potřebuješ tahat z sqlka všude :)
arikurumo
Profil *
super. díky.
rozmýšľal som hlavne nad rýchlosťou ale malá zmena uvažovania aj týmto smerom naozaj pomôže.
ešte raz dík.
fuckin
Profil
arikurumo:
data z db se po vypisu velice casto cachuji. Pokud mas velky traffic je to vyhodne. I kdyz to budes cachovat treba jen 30minut, prinese to mnohem lepsi vysledky nez zatezovat databazi porad dokola.
mattyZEM
Profil
Ale 2 příkazy zas takový problém neudělají.
nightfish
Profil
mattyZEM:
Ale 2 příkazy zas takový problém neudělají.
a když jich bude 5? nebo 10? kolik je ta správná hranice?
taky nezapomínej na to, že požadavky na skript mohou přicházet paralelně - pak to není rozdíl 1 nebo 2 dotazy, ale třeba 100 a 200 dotazů...
AM_
Profil
Pokud je to web, kam chodí řádově desítky lidí denně, opravdu se vyplatí takto optimalizovat?
nightfish
Profil
AM:
opravdu se vyplatí takto optimalizovat?
řekl bych, že načítání jen těch údajů z tabulky, které použiješ, není ani tak optimalizace, spíše dobrý programátorský zvyk
AM_
Profil
nightfish:
řekl bych, že načítání jen těch údajů z tabulky, které použiješ, není ani tak optimalizace, spíše dobrý programátorský zvyk
Myslel jsem, že se dohadujeme o cachování. To opravdu není u tak malých webů na místě.
Co se týče kulturně napsaného dotazu, samozřejmě souhlasím.
nightfish
Profil
AM:
Myslel jsem, že se dohadujeme o cachování.
aha, tím se to vysvětluje
jediným, kdo cachování zmínil, byl fuckin [#8]
kdyžtak prosím příště napiš, na koho reaguješ, ať si ušetříme neporozumění
mattyZEM
Profil
nightfish:
a když jich bude 5? nebo 10? kolik je ta správná hranice?
taky nezapomínej na to, že požadavky na skript mohou přicházet paralelně - pak to není rozdíl 1 nebo 2 dotazy, ale třeba 100 a 200 dotazů...
Tak použiju jednoduše soubory :P8-)
AM_
Profil
mattyZEM:
Tak použiju jednoduše soubory :P
to si teda pomůžeš. Naopak, soubory jsou rychlejší při práci s malými a jednoduchými daty. Databáze jsou tu právě kvůli organizaci rozsáhlých tabulkových dat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: