PHP, MySQL i veliki podaci

Wrong Turn

Domaćin
Banovan
Poruka
4.812
Poslednjih godinu dana stalno radim sa velikim tabelama preko 100.000 redova ili sa velikim XML/CSV fajlovima koje treba uneti u tabelu...

Ono sa čim se uvek susretnem je jebbeni error Lost MySql connection during query, pa MySql has gone away, pa Lock Transaction (ako koristim transakcije), timeout error itd...

Rešavao sam to nekim forama, npr trenutno me zeza problem gde imam preko 200.000 utakmica u bazi, sada hoću da izvučem statistiku od tih utakmica, bukvalno sve što može da se izvuče, ja izvlačim. I to zahteva neke operacije formule, tako da svaka utakmica ima dosta računskih operacija pre nego što bude unet tim i statistika od svake u tabelu i onda kada pustim npr više od tri sezone odjednom, baja bukne sa 503 greškom iako sam sve time limite povećao na maksimum.
I onda moram ručno da dodam po dve sezone od 0001, nije to sada problem, nego me zanima ima li neko pametno rešenje?

Da možda gasim konekciju za svaku sezonu npr u petlji?
Kao da dođe do nagomilavanja procesa u mysql-u i onda pukne jer završeni procesi kao da se ne gase nego čekaju.

Svi time/memory limiti su na maksimumu, server ima 1gb rama.
To je cloudways server, ranije sam radio na 2gb, pa se isto dešavalo.
Ranije sam koristio transakcije. Sada radim na CI.
 
Poslednja izmena:
Prvo i najglavnije je optimizovanje upita. Jedan INSERT upit za sve redove je bolji od ogromnog broja upita za svaki red pojedinačno.

Kod:
INSERT INTO tabela (x, y, z) VALUES (1,2,3), (4,5,6),  ...

Je l' si probao da koristiš LOAD DATA INFILE?
http://dev.mysql.com/doc/refman/5.7/en/load-data.html

To bi moglo da ti pomogne sa fajlovima (ako se u njima nalaze informacije koje hoćeš da učitaš u bazu).

U zavisnosti od tabela koje koristiš (InnoDB ili MyISAM), možeš da probaš i sa bulk loading-om.
 
Prvo i najglavnije je optimizovanje upita. Jedan INSERT upit za sve redove je bolji od ogromnog broja upita za svaki red pojedinačno.

Kod:
INSERT INTO tabela (x, y, z) VALUES (1,2,3), (4,5,6),  ...

Je l' si probao da koristiš LOAD DATA INFILE?
http://dev.mysql.com/doc/refman/5.7/en/load-data.html

To bi moglo da ti pomogne sa fajlovima (ako se u njima nalaze informacije koje hoćeš da učitaš u bazu).

U zavisnosti od tabela koje koristiš (InnoDB ili MyISAM), možeš da probaš i sa bulk loading-om.

Hmm, nisam znao za INSERT u jednom redu.
Znaci nabijem na string
Kod:
$values = '';
loop{
$values .= "(".$col1,".",$col2,".",$col3,"),";
}
INSERT INTO tabela (x, y, z) VALUES $values
?

Malo je to nezgodno kada koristim codeignitier i insert into on duplicate key update jer tada ne mogu active record da koristim, a moram proslediti array u query, onda bi ovo gore morao zameniti upitnicima tako da izgleda:

INSERT INTO tabela (x, y, z) VALUES (?,?,?), (?,?,?), ...
a upitnike bi menjao array(1,2,3,4,5,6...) i onda bi vremenom taj array postao ogroman i verovatno bi vratio 503 zbog ogromnog load-a.
 
Poslednja izmena:
Jel mozes da pojasnis ovaj deo:

I to zahteva neke operacije formule, tako da svaka utakmica ima dosta računskih operacija pre nego što bude unet tim i statistika od svake u tabelu i onda kada pustim npr više od tri sezone odjednom, baja bukne sa 503 greškom iako sam sve time limite povećao na maksimum.

Nije valjda da mucis mysql da ti radi te operacije?

Primer nekog upita?

A kada ti izbaci gresku pogledaj gde je zapelo:

Kod:
show full process list
 
Ja imam slican problem. Koristim MySql server 5.7 baza je radnici InnoDb a polja su sifraradnika i imeradnika, sve radim u visual studio 2015. Koristim textBox da se ukuca sifra radnika u promeljivu wsifrarad, koju kasnije insertujem u bazu. Ali umesto sa drzaja koji je ukucan u wsifrarad da upise u bazi, stalno upoisuje wsifrarad. A evo i dela programa. Kako da se sadrzaj wsifrarad insertuje u polje sifraradnika baze?

string myConnectionString = @"server=localhost;userid=root;password=root";
MySqlConnection conn = new MySqlConnection(myConnectionString);
try
{
conn.Open();
string wsifrarad = "rade";
string query2 = "INSERT INTO ris_sema.lozinke(sifraradnika) VALUES('wsifrarad')";
{
MySqlCommand cmd2 = new MySqlCommand(query2, conn);
cmd2.ExecuteNonQuery();
conn.Close();
 
Ne znam za visual studio ali ti u kveriju ne pozivas promenljivu posto ti je sve pod navodnicima, tako da se izvrsava as it is. U Javi to bi bilo nesto ovako:
String wsifrarad = "rade";
String query2 = "INSERT INTO ris_sema.lozinke(sifraradnika) VALUES(' " + wsifrarad +" ')";
Ako mke secanje dobro sluzi.
 
Ne znam za visual studio ali ti u kveriju ne pozivas promenljivu posto ti je sve pod navodnicima, tako da se izvrsava as it is. U Javi to bi bilo nesto ovako:
String wsifrarad = "rade";
String query2 = "INSERT INTO ris_sema.lozinke(sifraradnika) VALUES(' " + wsifrarad +" ')";
Ako mke secanje dobro sluzi.

Da, baš tako.
Stim da može da koristi i StoredProcedure, parametarske upite ili kursore na strani servera. Tako je bar u TSql-u.
 

Back
Top