2013-02-18 15 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.

Problemi correlati