Autor | Zpráva | ||
---|---|---|---|
arikurumo Profil * |
#1 · Zasláno: 17. 1. 2010, 22:51:54
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 |
#2 · Zasláno: 17. 1. 2010, 22:57:31
where meno in ('Miro', 'Fero') |
||
arikurumo Profil * |
#3 · Zasláno: 18. 1. 2010, 22:00:27
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 |
#4 · Zasláno: 18. 1. 2010, 22:08:27 · Upravil/a: AM_
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 * |
#5 · Zasláno: 18. 1. 2010, 23:02:55
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 |
#6 · Zasláno: 18. 1. 2010, 23:06:24 · Upravil/a: mattyZEM
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 * |
#7 · Zasláno: 18. 1. 2010, 23:27:20
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 |
#8 · Zasláno: 19. 1. 2010, 07:03:28
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 |
#9 · Zasláno: 19. 1. 2010, 07:10:50
Ale 2 příkazy zas takový problém neudělají.
|
||
nightfish Profil |
#10 · Zasláno: 19. 1. 2010, 08:23:14
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 |
#11 · Zasláno: 19. 1. 2010, 09:35:27
Pokud je to web, kam chodí řádově desítky lidí denně, opravdu se vyplatí takto optimalizovat?
|
||
nightfish Profil |
#12 · Zasláno: 19. 1. 2010, 09:40:50
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 |
#13 · Zasláno: 19. 1. 2010, 13:34:14
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 |
#14 · Zasláno: 19. 1. 2010, 14:01:03
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 |
#15 · Zasláno: 19. 1. 2010, 14:41:01
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 |
#16 · Zasláno: 19. 1. 2010, 15:06:44
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. |
||
Časová prodleva: 13 let
|
0