Hledáte fotografa?
Zobrazují se odpovědi 1 až 12 z 12

Vlozit pokud neexistuje, aktualizace pokud existuje

  1. tomix Hodnocení: 5 (100%) tomix je zatím velká neznámá
    1
    Ahoj,

    delam si emailovou databazi a narazil jsem na podstatny problem - rychlost. Vsechny emaily vlozim (po radcich pres textarea) do pole $emaily. Splodil jsem tento kod ktery funguje dobre, ale potreboval bych ho upravit aby frcel podstatne rychleji - pokud zaznam existuje, aktualizovat pozadovany sloupec s emailem, pokud neexistuje, vlozit novy radek. Skript bezi na localhostu, ale i tak zpracuje jen cca 400 emailu/min a postupne pozvolna zpomaluje


    PHP kód:
    ...
    foreach(
    $emaily as $em) {
        
    KontrolaEmailu($em);
        
    $result mysql_query("update `edb` set `$ktg`='1' where email='$em';");         
        if (
    mysql_affected_rows()==0) {
          
    $result mysql_query("insert into edb (email,$ktg) values ('$em','1');");
          
    $vok[]=$em;
          if(
    $debug==0) echo "Vlozen $em <br>";
        }
        else {
          
    $aok[]=$em;
          if(
    $debug==0) echo "Aktualizovan $em <br>";
        }

    }
    ... 
    Diky za vsechny rady

  2. Co se právě děje na Webtrhu?
  3. martinzsa Hodnocení: 1 (100%) martinzsa je na dobré cestě
    2
    co tak skusit pouzit transakcie ? spustis transakciu pred tym tvojim cyklom, vykonas cyklus a commitnes DB. ukladanie by sa malo potom vykonat ako jeden prikaz cize by malo byt rychle...
    priklad (sice nie v php ale vb.net): ukadal som radovo tisice zaznamov do sqlite db a cely cyklus ulozenia trval daco cez minutu, po pridani transakcii to padlo na dakych 12-15sekund.

  4. tomix Hodnocení: 5 (100%) tomix je zatím velká neznámá
    3
    Eh vubec netusim o cem mluvis, natoz jak to provest... "programuju" jen tak svatecne

  5. takatom Hodnocení: 2 (100%) takatom je na dobré cestě
    4
    tabulka edb by měla mít email jako primární klíč. Pokud nemá, po vytvoření se script zrychlí.
    lepší pak bude příkaz
    INSERT INTO edb (email,$ktg) VALUES ('$em',1) ON DUPLICATE KEY UPDATE $ktg=1

  6. martinzsa Hodnocení: 1 (100%) martinzsa je na dobré cestě
    5
    Citace Původně odeslal tomix Zobrazit příspěvek
    Eh vubec netusim o cem mluvis, natoz jak to provest... "programuju" jen tak svatecne
    ak sa nemylim tak by to malo byt takto nejako syntaxou som si neni 100% isty kedze s php som nerobil uz par rokov:

    Kód:
    @mysql_query("BEGIN");  
    foreach($emaily as $em) {
        KontrolaEmailu($em);  
    @mysql_query("INSERT INTO edb (email,$ktg) VALUES ('$em',1) ON DUPLICATE KEY UPDATE $ktg=1;"); 
    }
    @mysql_query("COMMIT"); // vykonanie committu dat

  7. Přesně k tomu (vložit a když existuje, tak updatnout) slouží v MySQL příkaz replace:
    http://dev.mysql.com/doc/refman/5.0/en/replace.html

    V podstatě místo "insert into tabulka ([položky ...]) values ([hodnoty ...])" se napíše "replace into tabulka ([položky ...]) values ([hodnoty ...])"

  8. martinzsa Hodnocení: 1 (100%) martinzsa je na dobré cestě
    7
    replace nerobi update riadku ale na duplicitny riadok zavola delete a potom insert cize neupravujes iba konkretne hodnoty ale komplet cely zaznam...

  9. tak, replace je sice pekna fce, ale vykonava novy insert, coz je v tolika pripadech na skodu, ze se hodi fakt jen k velmi malemu mnozstvi operaci (ve vetsine pripadu je smazani radku destruktivni neskutecne, nebot pri provazanych relacich to muze smazat/znehodnotit spousty dalsich dat)

  10. tomas86 Hodnocení: 2 (100%) tomas86 je na dobré cestě
    9
    Jednoduše plýtváš paměť zbytečným vypisováním echa. Odstraň echa a script poběží rychleji.

  11. to sice ano, ale podle me ma i spatne indexy protoze 400/min ? pri tomhle kodu? nemozne, pri milionu zaznamu velmi podobny script a jel ve stovkach za sekundu :)

  12. winexec Hodnocení: 36 (100%) winexec bude brzy slavný/á winexec bude brzy slavný/á
    11
    INSERT INTO edb (email,$ktg) VALUES ('$em',1) ON DUPLICATE KEY UPDATE $ktg=1

    Bude asi urcite nejrychlejsi

  13. tomix Hodnocení: 5 (100%) tomix je zatím velká neznámá
    12
    Citace Původně odeslal takatom Zobrazit příspěvek
    tabulka edb by měla mít email jako primární klíč. Pokud nemá, po vytvoření se script zrychlí.
    lepší pak bude příkaz
    INSERT INTO edb (email,$ktg) VALUES ('$em',1) ON DUPLICATE KEY UPDATE $ktg=1
    Pouzil jsem toto reseni a dopadlo to takto:
    Puvodne: 400em/60sek ---> Nyni: 11200em/13sek

    Diky moc vsem, takatom rep+

Hostujeme u Server powered by TELE3