2013-02-18 13 views
7

Ho una domanda: ho costruito una grande applicazione con Yii e InnoDB ed è venuto al problema, che l'inserimento/aggiornamento durate davvero molto tempo, ecco il mio rapporto php:Yii Framework - InnoDB vs MyISAM

InnoDB: Admin update User 55.247464895248 secondi ekuskov aggiornamento utente 13.282548904419 secondi doriwall aggiornamento utente 0.002094030380249 secondi

MYISAM: Admin update User 7.8317859172821 secondi ekuskov aggiornamento utente 1.6304929256439 secondi doriwall aggiornamento utente ,00208592414855 96 secondi

Qualcuno può suggerire qualche soluzione per accelerare l'inserimento/aggiornamento?

MODIFICA --------------------------------------------- -

ora ho usato un po 'molto semplice via di inserimento:

public function run($args) { 
    $time = -microtime(true); 

    $begin = DateTime::createFromFormat('Y-m-d H:i:s', '2010-01-01 00:00:00'); 
    $end = DateTime::createFromFormat('Y-m-d H:i:s', '2013-01-01 00:00:00'); 
    $end->add(new DateInterval('P1D')); 
    $interval = DateInterval::createFromDateString('1 day'); 
    $days  = new DatePeriod($begin, $interval, $end); 


    foreach ($days as $day) { 
     echo "i"; 
     $track = new TimeTracking(); 
     $track->user_id = 25; 
     $track->date = $day->format('Y-m-d H:i:s'); 
     $track->active = 4; 
     $track->save(false); 
    } 

    $time += microtime(true); 
    echo count($days)." items insert - $time seconds\n"; 
} 

e ora i tempi INSERISCI sono i seguenti:

InnoDB: articoli inseriscono - 72.269570827484 secondi

MyISAM: articoli inseriscono - ,87537479400635 secondi

[EDIT] E Adesso contavo per l'intero metodo Save e Yii Modelli "save()" Funzione:

UPDATE: modello-> Salva (falsi) - 0.1096498966217 secondi

UPDATE : regolatore funzione di risparmio() - 0.1302649974823 secondi

Crea: modello-> Salva (falsi) - 0.052282094955444 secondi

CREATE: controllore funzione di risparmio() - 0.057214975357056 secondi

Perché il metodo save() richiede così tanto tempo?

[EDIT] Ho testato save() vs il comando() e durate stessa:

$track->save(false); 

o

$command = Yii::app()->db->createCommand(); 
      $command->insert('timeTracking', array(
        'id'=>NULL, 
        'date'=>$track->date, 
        'active'=>$track->active, 
        'user_id'=>$track->user_id, 
      )); 

EDIT ------ -----------------------

E qui c'è una statistica per l'inserimento di 1.097 oggetti :

save(): 0.86-0.94, 
$command->insert(): 0.67-0.72, 
$command->execute(): 0.46-0.48, 
mysql_query(): 0.33-0.36 

FINALMENTE risposta: Se si desidera utilizzare alcuni massicci INSERT o UPDATE metodi che si dovrebbe prendere in considerazione per creare le funzioni con chiamate dirette MYSQL, non ci si risparmia quasi il 70% del tempo di esecuzione.

saluti,

Edgar

+0

Questo non suona giusto. Forse dovresti controllare le tue domande. Qual è la differenza tra gli utenti admin, ekuskov e doriwall? –

+0

puoi pubblicare le tue strutture da tavolo? – DarkMukke

+0

http://d.pr/i/P6zp La funzione aggiorna solo i tempi di equilibrio per ciascun utente. – ekussberg

risposta

0

Con Yii e InnoDB È dovrebbero avvolgere i comandi in una transazione in questo modo:

$transaction = Yii::app()->db->beginTransaction(); 

try { 
    // TODO Loop through all of your inserts 

    $transaction->commit(); 
} catch (Exception $ex) { 
    // There was some type of error. Rollback the last transaction 
    $transaction->rollback(); 
} 
0

La soluzione era: per queste tabelle, in cui è necessario grandi inserti e una risposta rapida, convertirli in MyISAM. In caso contrario, l'utente deve attendere a lungo e c'è una minaccia, che il PHP Max Script Execution Time fermerà il tuo script.

0

InnoDB è un motore molto più complesso e ricco di funzionalità rispetto a MyISAM per molti aspetti. Ciò lo rende più lento e non c'è molto che tu possa fare nelle tue query, configurazione o altro per risolverlo. Tuttavia, MySQL sta cercando di colmare il divario con gli aggiornamenti recenti.

Guardate versione 5.6:

http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html

La cosa migliore potrebbe essere quella di aggiornare la versione di MySQL, se sei dietro.

1

Una tabella che striscia sull'inserto e sull'aggiornamento può indicare che hai un po 'trascinato con i tuoi indici. Ricordare che il DB deve interrompere e ricompilare gli indici dopo ogni commit.

0

InnoDB offre la possibilità di creare relazioni e vincoli che rendono il database più veloce e sarete in grado di generare modelli con le relazioni &.

Si potrebbe anche considerare di suddividere le query in quelle più piccole ed eseguirle una alla volta.

0

Come affermano gli specialisti MySQL, utilizzare InnoDB fino a quando non è possibile dimostrare esplicitamente che è necessario MyISAM. I problemi di prestazioni non sono un buon argomento.

Se si dispone di un'applicazione di grandi dimensioni, è probabile che si verifichino problemi con i blocchi a livello di tabella e l'incoerenza dei dati. Quindi utilizzare InnoDB.

Il problema di prestazioni può essere collegato alla mancanza di indici o disco rigido e ai relativi problemi del file system.

Ho lavorato con tabelle con centinaia di milioni di righe che sono state aggiornate e inserite costantemente da diverse connessioni. Quelle tabelle avevano il motore InnoDB.

Ovviamente, si dispone di dati che devono essere aggiunti in un gruppo, aggiungerli utilizzando una istruzione di inserimento.