Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Veliki broj mysql query-ja

[es] :: PHP :: Veliki broj mysql query-ja

[ Pregleda: 1188 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Veliki broj mysql query-ja21.10.2009. u 13:41 - pre 143 meseci
Poz.

Imam jedan niz (koji sam napunio iz mysql baze) i 10ak tabela u kojima je PO oko 3.000 do 10.000 rekorda (ukupno recimo 50.000)
Potrebno mi je da prodjem sa while petljom kroz sve te tabele i da provjerim sve rekorde (za 1 kolonu). Ako se to polje nalazi u gore pomenutom nizu, potrebno je izvrsiti UPDATE tog reda.
I to tako sto ce ga zamjenit za vrijednost iz ovog niza (kljuc je to polje iz tog reda).

E sad sam uspio izpisat sve te query-je u HTML, ali kad stavim da se izvrsavaju to traje vjecnost (tacnije pustio sam 15-ak min da radi ali nije zavrsio). Probao sam sa mysql_free_result() ali isto (vidjecete dole na kraju kod-a je zakomentirano)


Postavicu ovde kod, pa bi molio za bilo kakvu pomoc?


napomena:
imamo 2 niza $old_kemids_rev i $old_kemids (isti su samo je uradjen array_flip() )

Code:


$pr = mysql_query("SHOW TABLES from baza LIKE '30a_%'") or die(mysql_error());
while($iz = mysql_fetch_array($pr)){
    $tbl = $iz[0];

    $suff = str_replace('30a','',$tbl);

    if($tbl != '30a_sest'){

//--------------------------------------------------------------------------------------------------------
        // prikazemo kolone
        $pr1 = mysql_query("show columns from $tbl");
        // uzmemo drugu kolonu (prva je kljuc)
        $col_name = mysql_result($pr1,1);
        // provjerimo jel $col_name kljuc, ako jeste uzmemo neku drugu
        if($col_name == 'kemid'){
            $col_name = mysql_result($pr1,0);
        }
        // uzmem red koji ispitujemo (koje treba update-ovat)
        $pr2 = mysql_query("select kemid FROM $tbl");
        while($iz2 = mysql_fetch_array($pr2)){
            $kemid = $iz2[0];
            // provjerimo da li postoji u nizu to polje:
            if(@in_array($kemid,$old_kemids) ){
                // uzimamo vrijednost za to polje: 
                $ekvivalent = $old_kemids_rev[$kemid];
                // uzmemo vrijednost gore pomenute kolone za taj red
                $pr3 = mysql_query("SELECT $col_name from 30$suff where kemid = $kemid");
                $iz3 = mysql_fetch_array($pr3);
                $value_from_30 = $iz3[0];
                // zamjenimo sa vrijednosti iz niza:
                if($value_from_30){
                    $q = "UPDATE $tbl SET kemid = '".$ekvivalent."'
                        WHERE kemid = '$kemid'
                        AND $col_name = \"$value_from_30\"";
                }
            //    echo "<p>$q</p>";
                mysql_query($q) or die('Greska u '.$tbl.':  '.mysql_error());
            //    mysql_free_result($pr3);
            }
        }
//-----------------------------------------------------------------------------------------------------------

    }
}
/* End of replacing 'kemids' */



[Ovu poruku je menjao vatri dana 22.10.2009. u 09:48 GMT+1]
 
Odgovor na temu

dakipro
Dalibor Jovic
Web Developer
Bergen, Norway

Moderator
Član broj: 31848
Poruke: 1792
91.148.91.*

Sajt: norway.dakipro.com


+190 Profil

icon Re: Veliki broj mysql query-ja21.10.2009. u 13:54 - pre 143 meseci
Bez puno gledanja u kod, samo da pitam da li mozda mozes nekako vrtiti taj niz, i samo raditi update sa predefinisanim where delom koji ti odgovara po nizu?
Znaci izvrtis sta trebas da izmenjas iz niza, i samo pustat update, izbacis ovaj select, mozda bi to ubrzalo sve ovo, naravno, ako ti logika to omogucava, kazem, nisam previse gledao kod, samo pristup
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Re: Veliki broj mysql query-ja22.10.2009. u 11:44 - pre 143 meseci
evo pustio sam malo da prenoci ne bi li se sjetio neceg ali nista pametno.

daki nisam najbolje razumio pitanje, ali ako si mislio to sto ja mislim da si mislio, onda ne moze. :)

Stvar je ovakva

-baza:

30a_osnovna (kemid, old_kemid,..., i_jos_neka_nebitna_polja)
---------------------------------------
29_prva (kemid, ..., jos_neka_nebitna_polja) < br. kolona nije preciziran

29_druga (kemid, ...., jos_nesto...) < br. kolona nije preciziran
---------------------------------------
30_prva ... < ista struktura ko 29_prva samo vrijednost polja i broj redova je moguce razlicito

30_druga < isti slucaj
----------------------------------------
...
..
ima_jos_tabela


znaci imam 2 verzije baze, odnostno tabele sa prefiksom 29_ i 30_ . 29 je stara 30 je nova. te 2 verzije moram zdruziti na sledeci nacin:

- u 30 verziji su bili dodani rekordi i pored toga postoje neki iz 29 koji su promjenjeni
- trebam dobiti novu veziju (30a_) koji sadrze ove 2 verzije zdruzene.
- imam tabelu 30a_osnovna gdje se nalaze kemid i old_kemid:
--- old_kemid je onaj kemid iz 30ke cije su se ostale kolone (njene vrednosti) nalazile u 29 ali su bili promjenjeni (zajedno sa kemid-om)


skripta:

--- skriptu sam napravio koja uradi sledece:

|------ kopira sve tabele iz 29_ u 30a_.
|------ izbrise one koje imaju vrednost kemid u 30a_osnovna (znaci da ima ekvivalenta iz 30ke)
|------ kopira sve iz 30ke

e sledeci korak je samo da te sto sam zadnje kopirao UPDATE-ujem tako da im zamjenim kemid sa ekvivalentom iz 30a_osnovna
/////////////////////////////////////////////

Kao sto sam rekao uspio sam napisati skriptu koja unutar while petlje ima variablu $q koja sadrzi query koji treba izvrsit.

Sad sam stavio samo echo "<p>$q</p>" i to mi fino ispise u HTML sve kverije koji trebaju da budu izvseni. (to se izvrsi za 30-40 sekundi)
Ali kad stavim mysql_query($q) or die(mysql_error()) - kompjuter radi ali nikako da zavrsi (pustio sam ga 20 min) :s

Da li da ostavim racunar jos duze da radi ili mozda da probam tu variablu popunit u while petlji da izgleda ovako nesto:

UPDATE 30a_prva SET kemid = '3727' WHERE kemid = '859' AND druga_kolona = "620" ;
UPDATE 30a_prva SET kemid = '3728' WHERE kemid = '869' AND druga_kolona = "623" ;
... itd

i na kraju stavim mysql_query($q);

Da li moze tako da se izvrsi query u mysql_query() funkciji?
 
Odgovor na temu

Nemke_BG

Član broj: 163822
Poruke: 341
*.bg.krstarica.net.

Jabber: Nemke_BG@elitesecurity.org
Sajt: https://www.nmdesign.rs


+45 Profil

icon Re: Veliki broj mysql query-ja23.10.2009. u 08:51 - pre 143 meseci
tako nesto ne moze u mysql_query() da prodje, za to bi trebao da koristis mysqli_multi_query() f-ju ili da to posaljes kao transakciju(ako koristis MyIsam izbegavaj, a ako koristis InnoDB onda slobodno ), to bi trebalo da ti dosta smanji duzinu izrsavanja skripte....
...
 
Odgovor na temu

w3bl0rd
Varaždin, Hrvatska

Član broj: 82659
Poruke: 380
213.147.114.*



+26 Profil

icon Re: Veliki broj mysql query-ja23.10.2009. u 09:07 - pre 143 meseci
ne znam sad koliko redova imaš u bazi no mmožda bi ti bilo brže da selektiraš van sve iz cijele tabele pa onda u php-u da filtriraš što ćeš prikazat a što ne...
there's no place like 127.0.0.1
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.dial-up.dsl.siol.net.



+18 Profil

icon Re: Veliki broj mysql query-ja23.10.2009. u 10:40 - pre 143 meseci
evo uspio sam nekako, tj. komp je uspio :))

uradio sam ovo: $mysqli->multi_query($q); i pustio ga tacno 1655 sekundi....

Hvala svima na trudu...
 
Odgovor na temu

[es] :: PHP :: Veliki broj mysql query-ja

[ Pregleda: 1188 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.