Topic: UPdate optimizavimas

Sveiki
As jau buvau rases apie sia problema, bet tuo metu ji buvo uzsimirsusi.. ir visgi man jos niekaip nepavyksta normaliai ispresti...

Situacija:
Nuskaitau is lenteliu pradinius duomenis (daug eiluciu ir su laiku jie labai stipriai augs), 
Tuomet su PHP kiekvienai eilutej apskaiciuoju tam tikras reiksmes (Skaiciavimu i sql uzklausa sukisti nelabai imanoma, nes skaiciavimuose naudojama tik php aplinkoje paties pasirasytos funkcijos)
Tada atnaujinu visus tuos pradinius irasus esancius DB(su naujai apskaiciuotomis reiksmemis) 

Taigi siuo metu kiekvienai eilutej gaunasi po viena Updato queri. Manau tai yra labai neekonomiska.
Gal yra kokie sios problemos sprendimo budai?
(Apsirasyti funkcijas paciam SQL jei tai imanoma?? )
(Naudoti kazkokias laikinas lenteles, kazka minimaliai teko girdet....)

Re: UPdate optimizavimas

Sveikas,

Skaičiau pora kartų, bet nelabai supratau kame problema? Tame, kad kiekvienai eilutei reikalingas atskiras UPDATE? Tai yra labai normalu ir nematau čia jokios problemos. Suprasčiau. Problema gali būti, kad tarkim UPDATE vyksta per ilgai ar išnaudoja per daug resursų ar dar kas. O faktas, kad kiekvienai eilutei atnaujinti naudoajama atskira SQL užklausa yra labai normalus dalykas.

Aišku visada yra visokių niuansų, keli iš jų:

a) viskas veiks šiektiek greičiau jeigu atjungsi indeksų/apribojimų (INDEX/RELATIONS) tikrinimą jeigu tokia galimybė yra;
b) kelis UPDATE sakinius siųsti per vieną užklausą atskyrus kableliais ($sql = "UPDATE ....; UPDATE .....; UPDATE ....;");
c) skaičiavimus galima kelti i MySQL serverį pasinaudojant stored procedūrom ir/arba grynu SQL'u, bet konkrečiu atveju reikia realizuoti ir testuoti, kas greičiau ir efektyviau veikia; Stored procedūros palaikomos nuo MySQL 5.x versijos, ir pats SQL'as yra pakankamai funkcionalus kad būtų galima atlikti sudėtingus skaičiavimus (aišku nekalbu apie tuos atvejus kai naudojamos išplėstos PHP funkcijos iš kitų modulių);

Labai gerai būtų jeigu pateiktum pradinių duomenų pavyzdžių, jų apdorojimo algoritmą (kad ir PHP kalboje) ir naudojamus UPDATE sakinius, tada gal būtų galima patarti ir ką nors konkrečiau.

Re: UPdate optimizavimas

Taip problema yra tame, kad kiekvienai eilutei reikalingas atskiras UPDATE? Ir siuo atveju ju kiekis gali labai smarkiai padideti .. tarkim iki sesiazenklio skaiciaus.. tai nebus labai neefektyvu?
Updatinimas ir vyksta pagal indexus, t.y.  update .... where id = ...   ir tokiu sakiniu vienu kartu ivykdoma bus vis daugiau priklausomai nuo projekto sekmes.. gali siekti ir sesiazenklius skaicius...
Na pas mane mysql4 :)
duomenu apdorojimo algoritmai pakankamai daznai atnaujinami, jie susideda is gal ~20 funkciju, siaip realiai tai dabar paskaitinejau daugiau, tai gal it butu galima kaip nors visa tai perkelti i mysql`a..
Bet jei manai kad daug Update atskiru nera LABAI blogai, tada gal kol kas si reikala paliksiu ir kai rasiu daugiau laiko bandysiu viska i mysql`a perkelti ir ziureti ar pagreiteja kas nors ar ne ...

realiai tai optimizuodamas SQL uzklausas pas save sutaupiau labai daug serverio resursu;) tai dabar sunku sustoti :)

Re: UPdate optimizavimas

Taip, atskiras UPDATE kiekvienai eilutei nėra blogai jeigu to reikalauja funkcionalumas.

Jeigu sugebėtum visą algoritmą perkelti į SQL'a tada visus duomenis atnaujintum pasinaudojęs viena užklausa. Gali būti, kad ji bus vykdoma pakankamai ilgai, ir netgi ilgiau negu naudojant PHP (nes gali reikėtų daugiau operatyvinės atminties ir pan.).

UPDATE sakiniai turi pakankamai apribojimų (pvz.: negali UPDATE sakinyje naudoti SELECT sakinio iš updeitinamo stulpelio), todėl turint sudetingus skaičiavimus naudojant atnaujinamų stulpelių duomenis gali būti labai sunku neverta visko kelti į MySQL serverį.

Re: UPdate optimizavimas

Kažkodėl man nesuveikia tokia funkcija:

mysql_query("UPDATE naujienos SET aprasymas = '4144' WHERE id =1 LIMIT 1;
UPDATE naujienos SET aprasymas = '1115' WHERE id =2 LIMIT 1");

kas gali buti blogai?

Re: UPdate optimizavimas

Blogai tas, kad naudoji komanda taip, kaip neleistina pagal dokumentaciją: http://www.php.net/manual/en/function.mysql-query.php

Negalima naudoti dviejų užklausų.

Beto, kam tie "LIMIT 1" gale užklausų? Jie nieko nedaro ;)

Naudok taip:

mysql_query("UPDATE naujienos SET aprasymas = '4144' WHERE id =1") or die(mysql_error());
mysql_query("UPDATE naujienos SET aprasymas = '1115' WHERE id =2") or die(mysql_error());

Re: UPdate optimizavimas

Matai pas mane yra koks 200 - 250 sakiniu. o tai sukurti papildomai bereikalingo mysql uzklausu. Gal yra koks panasus variantas kaip su insert lentele (asas) value (1), (2), (3) ir t.t

Re: UPdate optimizavimas

Tai žinok, kad tu atskirsi UPDATE sakinius per kabliataškį tai vistiek tas pats gausis; Tiesiog naudok cikle ir normaliai bus;

O tokio masinio updeinimo tai dabar ant greitųjų nesugalvoju. Nebent naudoti LOW PRIORITY paramtrą, kad esant daug sakinių nesistabdytų kitos mysql operacijos, o UPDATE sakiniai būtų vykdomi tada, kai serveris atlaisvėja.

Re: UPdate optimizavimas

Nu aisq.parasiau tokia php skriptuka. Kuris kaip galima artimiau iterpia duomenis. ;)