Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [PHP - MySQL] - Velocizzare Inserimento Record

    Buongiorno a tutti,
    esiste un modo per velocizzare l'inserimento in database di record?
    Al momento con uno script carico da file a database un enorme quantità di dati... con 240 secondi massimi di script php mi inserisce la bellezza di 6362 record, posto il codice che uso (almeno la parte interessata).

    Codice PHP:
    foreach($xml->prezzario->prodotto as $article)
    {
        
        
    $a $article['prodottoId'];
        
    $b $article['prdId'];
        
    $c $article->prdDescrizione['breve'];
        
    $d $article->prdDescrizione['estesa'];
        if (isset(
    $article['unitaDiMisuraId']))
        {
            
    $var0 $article['unitaDiMisuraId'];
            
    $var4 $article->prdQuotazione['valore'];
            
    $c addslashes(stripslashes($c));
            
    $d addslashes(stripslashes($d));
            
    $qri "INSERT INTO ".$var3." (prodottoId, prdId, unitaDiMisuraId, breve, estesa, valore) VALUES ('$a', '$b', '$var0','$c', '$d', '$var4')";
        }
        else
        {
            
    $c addslashes(stripslashes($c));
            
    $d addslashes(stripslashes($d));
            
    $qri "INSERT INTO ".$var3." (prodottoId, prdId, breve, estesa) VALUES ('$a', '$b','$c', '$d')";
        }
        if (
    mysql_query($qri$db))
        {
        }
        else
        {
            echo 
    mysql_error();
        }
    }
    ?> 

  2. #2
    Per l'inserimento di nuovi record indipendenti in una tabella la velocità dipende dalla capacità di calcolo della macchina, mentre al contrario delle letture se hai una tabella indicizzata a dovere puoi aumentare notevolmente la lettura con una SELECT per gli inserimenti quello che puoi fare è ridurre al minimo il numero di campi ottimizzando il codice escludendo così tutti quei campi che potrebbero essere ripetuti in altre tabelle.

    per farti un esempio sul mio Pc Portatile con la stessa query inserisco circa 5000 recordo in 30 secondi, mentre su quello di casa che è un Dual Core 2 a 2,2 Ghz riesco a inserirne quasi 12000

    Ciao,

  3. #3
    potresti anche utilzzaare un acceleratore tipo eAccelerator che è un gestore di caching per PHP e che dovrebbe appunto accelerare molte operazioni.

  4. #4
    Confesso che non so cosa sia eAccelerator ma comunque sia a livello di codice più pulito e mirato sei a fare qualsiasi operazione sul db e minore è il tempo di risposta.

    :-) il tuo codice mi pare privo di qualsiasi ridondanza inutile

  5. #5
    ti ringrazio per le osservazioni, per quanto riguarda gli inserimenti e le select ... a me viene consegnato un file xml (di cui ovviamente non conosco il nome a prescindere), estrapolo i dati ed inserisco nel mio database sql ove gira poi anche il mio programma in php... ora, attualmente faccio un operazione del tipo:

    -> Prendi riga 1 file xml
    -> Controlla il tipo
    -> Inserisce nella tabella sql dopo averla creata

    Ho trovato una funzione che mi consente di fare query sql con un array (il discorso non è semplice quanto voglio farlo), che verrebbe così:

    -> Prendi tutte le righe
    -> Controlla il tipo e setta query
    -> Lancia tutte le query in sequenza

    provo così, magari risolvo, ad ogni modo la macchina su cui faccio i test è abbastanza scadente, in compenso cerco sempre di sfruttare al massimo il codice che faccio riducendo i tempi

    A presto. Grazie mille.

  6. #6
    strano che non conoscete eAccelerator.. http://eaccelerator.net/ va davvero a meraviglia!!!

  7. #7
    posto il nuovo codice da me usato:

    Codice PHP:
    <?php
    Header
    ('Cache-Control: no-cache');
    Header('Pragma: no-cache');
    $var "Prezzario_UNI6.xml";
    $var1 "Prezzario_Piemonte";
    $xml simplexml_load_file($var);
    $var2 "um_".$var1."";
    $var3 "co_".$var1."";
    $query0 " CREATE TABLE ".$var2." (unitaDiMisuraId VARCHAR( 50 ), udmId VARCHAR( 10 ) ,simbolo TEXT ,decimali INT( 2 ) ,breve TEXT )";
    if (
    mysql_query($query0$db))
    echo 
    "Parte 1 effettuata";
    else
    echo 
    "Errore Parte 1";
    foreach(
    $xml->prezzario->unitaDiMisura as $article)
    {
        
    $a $article['unitaDiMisuraId'];
        
    $b $article['udmId'];
        
    $c $article['simbolo'];
        
    $d $article['decimali'];
        
    $e $article->udmDescrizione['breve'];
        
    $query1 "INSERT INTO ".$var2." (unitaDiMisuraId, udmId, simbolo, decimali, breve) VALUES ('$a', '$b', '$c', '$d', '$e')";
        if (
    mysql_query($query1$db))
        {
        }
        else
        {
        echo 
    "Errore Inserimento ".$a."";
        }
    }
    $query2 " CREATE TABLE ".$var3." (unitaDiMisuraId INT( 2 ) ,prodottoId INT( 30 ) ,prdId VARCHAR(30) ,breve TEXT  ,estesa TEXT , valore VARCHAR(10))";
    if (
    mysql_query($query2$db))
    echo 
    "Parte 2 effettuata";
    else
    echo 
    "Errore Parte 2";
    foreach(
    $xml->prezzario->prodotto as $article)
    {
        
        
    $a $article['prodottoId'];
        
    $b $article['prdId'];
        
    $c $article->prdDescrizione['breve'];
        
    $d $article->prdDescrizione['estesa'];
        if (isset(
    $article['unitaDiMisuraId']))
        {
            
    $var0 $article['unitaDiMisuraId'];
            
    $var4 $article->prdQuotazione['valore'];
            
    $c addslashes(stripslashes($c));
            
    $d addslashes(stripslashes($d));
            
    //$qri = "INSERT INTO ".$var3." (prodottoId, prdId, unitaDiMisuraId, breve, estesa, valore) VALUES ('$a', '$b', '$var0','$c', '$d', '$var4')";
            
    $qri[] = "INSERT INTO ".$var3." (prodottoId, prdId, unitaDiMisuraId, breve, estesa, valore) VALUES ('$a', '$b', '$var0','$c', '$d', '$var4')";
        }
        else
        {
            
    $c addslashes(stripslashes($c));
            
    $d addslashes(stripslashes($d));
            
    //$qri = "INSERT INTO ".$var3." (prodottoId, prdId, breve, estesa) VALUES ('$a', '$b','$c', '$d')";
            
    $qri[] = "INSERT INTO ".$var3." (prodottoId, prdId, breve, estesa) VALUES ('$a', '$b','$c', '$d')";
        }
        
    //if (mysql_query($qri, $db))
        //{
        //}
        //else
        //{
            //echo mysql_error();
        //}
    }
    $ax count($qri);
    print 
    $ax;
    $bx 0;
    while (
    $bx != $ax)
        {
            
    $arbalest $qri;
            
    mysql_query($arbalest[$bx],$db);
            
    $bx++;
        };

    //foreach ($qri as $q)
      //{
            //mysql_query($q['qr'], $db);
    //}
    ?>
    non riesce a caricare tutte le voci in 20 minuti -.- ora provo con 40 massimi (di minuti)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.