» »

[PHP + mysql] Kako vstaviti več vrstic naenkrat ?

[PHP + mysql] Kako vstaviti več vrstic naenkrat ?

blackmumba ::

while ($row = @mysql_fetch_array($sql)){
$i = $row["IDvsebina"];
$key = $row["keyword"];
$vsebina = vpisi_vsebino($i,$key);
mysql_query("UPDATE tralala SET vsebina='$vsebina' WHERE IDproduct='$IDproduct' AND key='$key'")
or die(mysql_error());
}

v primeru da se mi to vpiše 1000x, traja to ful časa oz. več kot 30sekund kot mi server dovoljuje.
v primeru da se vpise 500x se stvar zakluci pred 30sekundami

Kako bi recimo to vse izvedel z enim mysql_querijem ??

Jebiveter ::

Glede na to, da imas tukaj iz enega queryja v drugega prenesene podatke, rajs naredi loop v SQL-u, se pravi kot en query.
Certainty of death. Small chance of success. What are we waiting for?

Zgodovina sprememb…

  • spremenilo: Jebiveter ()

blackmumba ::

suprca ... kak primer bi sicer pomagal, drugače pa že googlam
hvala

blackmumba ::

hmmm. ne gre mi najbolš :( kako? kak nasvet ?

kopernik ::

Kakšen je tvoj worst-case scenarij ? Torej, ali je lahko vpisov deset tisoč ? sto tisoč ?

blackmumba ::

večinoma od 500 - 1500, lahko se pa zgodi tudi 2000. Več ne.
poskusil sem tudi max execution time povečat s htaccessom.

php_value max_execution_time 3160
php_value memory_limit 128M

brez učinka.

LP

Jebiveter ::

-Lan-, osebno sicer se nisem imel potrebe po programiranju v SQL-u (razen pac standardnih SELECT/INSERT/UPDATE/itd. statementov), vem pa da sem se enkrat igral z procedurami v PostgreSQL (pac, experimetiral malo).

Sem najdu se za mysql to kar rabis oz. kje lahko zacnes.
Certainty of death. Small chance of success. What are we waiting for?

kopernik ::

Če zadeva predolgo traja in se je ne da pohitriti, jo moraš izvesti asinhrono. Žal PHP zelo slabo poznam, zato ti ne morem kaj svetovati(niti glede optimizacije niti glede vzporednega izvajanja ...).

rokpok ::

Najboljše bo, da uporabiš MySQL stored procedures. Sicer se sam še nisem poglabljal v to, mislim pa, da ti bo primer na tem linku pomagal.

Lp
Rad bi bil pingvin.

Seadoo ::

Stored procedures pridejo v poštev le od verzije 5.0.1 naprej, če imaš probleme z predolgim izvajanjem potem daj na začetek php skripte set_time_limit(0); ukaz. To pomeni, da ni časovne omejitve. Navsezadnje, tudi če boš pognal proceduro v mysql bazi in bo trajala predolgo, se ti PHP skripta ne bo izvedla do konca. Jaz za take obdelave, ki so sicer zelo redke, a porabijo dolgo časa, uporabim set_time_limit().
Out of my mind. Back in five minutes.

frudi ::

če imaš možnost, prestavi funkcijo 'vpisi_vsebino(i, key)' na server. tako boš lahko operiral s celotnim setom podatkov naenkrat, ne le s posameznimi vrsticami. recimo "UPDATE tralala SET vsebina = vpisi_vsebino(IDvsebina, keyword)", ali kakorkoli bi že izgledala sintaksa v mysql. nimam pa pojma, kako je s podporo funkcijam in stored proceduram v mysql-u... :)
kot drugo, postavi indekse na stolpca IDvsebina in keyword
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Seadoo ::

Frudi, z indeksi je treba bit previden. Upočasnijo vstavljanje in brisanje zapisov, ker je potrebno vsakič ažurirat indeks, pohitrijo pa iskanje, ker hitreje pridemo do željenih zapisov. Indeksi bi v tem primeru prišli v poštev na poljih IDproduct in key (odvisno od dejanskih podatkov v tabeli), sigurno pa ne na polju vsebina. Ampak to velja za ta stavek, celotna postavitev indeksov je odvisna od uporabe te tabele skozi celoten sistem.
Out of my mind. Back in five minutes.

frudi ::

pardon, seveda bi bil smiselen indeks na polju IDprodukt, ne IDvsebina. sem bral površno in spregledal, da je v where pogoju update stavka produkt in ne vsebina :)

z indeksi je pa absolutno treba biti previden; ampak tipično vstavljanje v tabelo ni toliko problematično, ker se običajno vstavlja majhno število posameznih vrstic naenkrat. tako se običajno splača žrtvovati hitrost vpisovanja na račun hitrejšega iskanja zapisov za select/update.

je pa res, da je težko takole pametovati, če ne poznamo strukture in uporabe baze. sem pa vendarle takoj, ko sem videl, kako počasi se izvaja (več kot pol minute za update 1000 zapisov), pomislil, da so tabele slabo, če sploh, indeksirane.


p.s. a tole while ($row = @mysql_fetch_array($sql))
gre za vsako vrstico posebej brati iz baze ali prebere vse naenkrat? nimam pojma o php, zato sprašujem :)
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Zgodovina sprememb…

  • spremenilo: frudi ()

Ziga Dolhar ::

> p.s. a tole while ($row = @mysql_fetch_array($sql))
gre za vsako vrstico posebej brati iz baze ali prebere vse naenkrat? nimam pojma o php, zato sprašujem :)

Tole pofetcha vrstico-za-vrstico iz resursa, ki vsebuje celoten set rezultatov [in torej ne gre po vsako vrstico posebej prav v bazo].
https://dolhar.si/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

HTML in SQL pomoč (strani: 1 2 )

Oddelek: Programiranje
517687 (6565) def0r
»

unset cookie

Oddelek: Izdelava spletišč
221874 (1681) tomitza
»

[mysql] malo bolj zahtevna poizvedba

Oddelek: Programiranje
161597 (1448) destiny
»

Kaj je narobe tu...(php)

Oddelek: Programiranje
51202 (1100) teac
»

PHP help!

Oddelek: Programiranje
251742 (1580) rc-car

Več podobnih tem