[ Uroboros @ 07.05.2013. 08:00 ] @
Zanima me da li se brzina dodavanja podataka u MySQL preko PHP skripte moze nekako podesavati ili to zavisi od nekih drugih faktora? Naime, potrebno mi je da preko PHP skripte u bazu unesem nekih 5k+ unosa ali mi se desava da vreme za izvrsavanje skripte istekne a unos ne bude ni do pola zavrsen. Pokusao sam i sa podizanjem timeout-a na minut - dva ali i dalje ne uspeva. Jedino da ga povecam na desetak minuta pa da cekam :)
U pitanju je Wamp server sa PHP 5.3.13 i MySQL 5.5.24 (ako to znaci ista), masinu pokrece win7 sa 4GB rama...
[ g_maestroo @ 07.05.2013. 10:18 ] @
Ne bi trebao da imas problem sa tim. Ja uvek ubacujem par hiljada redova u bazu kad testiram i to mi se zavrsi za nekoliko sekundi. Proveri kod, moguce je da si napravio neku gresku, meni se to cesto desava kad se overloadujem poslom
[ Uroboros @ 07.05.2013. 19:20 ] @
I sa najjednostavnijom FOR petljom je uzasno spor unos... Sve mi se cini da je nesto sa podesavanjem servera u pitanju jer je sve ostalo na defaultu... I da, zaboravio sam da napomenem da je tip baze InnoDB.
[ cyBerManIA @ 07.05.2013. 19:32 ] @
Kakav query unosis (nesto prosto ili pokupis usput vise tabela u jednom komadu)?
Jel' ti wamp javlja neke greske? Ne koristim ga, ali sam video da kad ima neka greska (notice/warning/error) on pravi pauzu od ~1s.

[ Uroboros @ 07.05.2013. 19:55 ] @
Code:
for($i=0; $i<10000, $i++){
   mysqli_query($con,"INSERT INTO table_name (x, y, z) VALUES ($x, $y, $z)");
}

Ovo je samo primer koji sam takodje probao i koji je probio granicu za vremensko izvrsavanje PHP skripte (isao sam cak do 180 sec)...
[ bogdan.kecman @ 07.05.2013. 20:26 ] @
vezano za upit

insert into t1 (a,b,c) values (1,2,3), (2,3,4), (2,2,2), (3,3,3)....,(999,999,999);

je mnoooogo brze nego

insert into t1 (a,b,c) values (1,2,3);
insert into t1 (a,b,c) values (2,3,4);
insert into t1 (a,b,c) values (2,2,2);
insert into t1 (a,b,c) values (3,3,3);
...
insert into t1 (a,b,c) values (999,999,999);

vezano za konfig i innodb - koliki ti je innodb buffer pool? povecaj ga koliko god mozes, ostalo ostavi default za pocetak

vezano za brzinu, koliko indexa imas na tabeli? pre nego pocnes inserte uradi "alter table t1 disable keys" i onda kada zavrsis uradi alter table t1 enable keys, na taj nacin neces na svaki insert raditi rebildovanje indexa na tabeli (ako ih ima mnogo to moze da bude extra sporo posebno ako radis mnogo inserta umesto jedan veliki bulk insert)

pogledaj bigdump.php skript (proguglaj nacices), tu mozes da vidis primer kako da resis problem sa predugim trajanjem php-a posto uvek mozes da imas vise podataka nego sto je normalno da se web strana izvrsava tako da se data podeli u vise manjih taskova a php poziva sam sebe sa parametrima i tako radi manje chunkove date

dalje, zasto iz php-a radis toliki insert? nemoguce da je to projektni zadatak, ako se radi samo o inicijalnom insertu date u bazu koristi dump ili load data infile da ucitas datu u bazu
[ farmaceut @ 08.05.2013. 08:47 ] @
Slozi upit na nacin na koji je Bogdan sugerisao.

Radili smo slicnu stvar u Cold Fusion, caka je da ako u loopu vrtis pojedinacne inserte imas veliki overhead na komunikaciji izmedju app i database servera (koja se vrsi u svakom loop-u), te se skripta puno duze izvrsava.... sto tek primjeti kada u loopu imas mnogo rekorda.

Na kraju smo "slagali" upit tako da smo slagali po ~20 rekorda, pa odjednom poslali na MySQL server... pa tako u krug:

INSERT INTO t1 (a,b,c) VALUES(1,1,1), (2,2,2), (3,3,3).... (20,20,20);
INSERT INTO t1 (a,b,c) VALUES(21,21,21), (22,22,22), (23,23,23).... (30,30,30);
....
....

Optimalan broj rekorda koji ces slozit prije slanja sam odredi, nama je ~20 rekorda bio neki optimum jer su podaci bili glomazni, pa je "slaganje" vise od ~20 rekorda "jelo" previse memorije na app serveru... u tvom slucaju moze biti drugacije
[ Uroboros @ 08.05.2013. 13:43 ] @
Resio sam problem oko brzine sa START TRANSACTION pre i COMMIT posle izvrsavanja petlje. S ovim se posao zavrsi za cca 7 sekundi za 10k unosa.