2013-02-18 16 views
7

Ich habe eine Frage: Ich habe eine große Anwendung mit Yü und InnoDB gebaut und kam zu dem Problem, dass der insert/update durate wirklich wirklich lange Zeit, hier ist mein PHP-Bericht:Yü-Framework - InnoDB vs MyISAM

INNODB: Benutzer Admin Update 55,247464895248 Sekunden ekuskov Benutzer Update 13,282548904419 Sekunden doriwall Benutzer Update ,002094030380249 Sekunden

MYISAM: Benutzer admin Update 7,8317859172821 Sekunden ekuskov Benutzer Update 1,6304929256439 Sekunden doriwall Benutzer Update ,00208592414855 96 Sekunden

Kann jemand eine Lösung vorschlagen, um das Einfügen/Update zu beschleunigen?

BEARBEITEN --------------------------------------------- -

jetzt benutzte ich einige sehr einfache Insert-Loop:

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"; 
} 

und jetzt die INSERT Zeiten sind folgende:

InnoDB: Artikel einfügen - 72,269570827484 Sekunden

MyISAM: Artikel einfügen - ,87537479400635 Sekunden

[EDIT] Und jetzt Zählzeit für ganze SAVE-Methode und Yü Models "speichern()" Funktion i wurde:

UPDATE: modell-> save (false) - ,1096498966217 Sekunden

UPDATE : Controller Sparfunktion() - ,1302649974823 Sekunden

CREATE: modell-> save (false) - ,052282094955444 Sekunden

CREATE: controller Sparfunktion() - ,057214975357056 Sekunden

Warum dauert die save() Methode so lange?

[EDIT] Ich habe save() vs Befehl getestet() und sie durate gleich:

$track->save(false); 

oder

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

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

Und hier ist eine Statistik zum Einfügen von 1.097 Objekte :

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

ENDLICH ANTWORT: Wenn Sie einige massive INSERT oder UPDATE Methoden verwenden möchten, sollten Sie die Funktionen mit direktem MYSQL fordert zu schaffen betrachten zu, dort werden Sie fast 70% der Ausführungszeit sparen.

Grüße,

Edgar

+0

Das klingt nicht richtig. Vielleicht sollten Sie Ihre Fragen überprüfen. Was ist der Unterschied zwischen Benutzern von admin, ekuskov und doriwall? –

+0

Können Sie Ihre Tabellenstrukturen posten? – DarkMukke

+0

http://d.pr/i/P6zp Die Funktion aktualisiert nur die Balance-Zeiten für jeden Benutzer. – ekussberg

Antwort

0

Mit Yü und InnoDB Sie sollten Ihre Befehle in einer Transaktion wie so wickeln:

$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

Die Lösung war: für die Tabellen, in denen Sie große Einsätze brauchen und schnelle Antwort, wandeln Sie sie in MyISAM um. Andernfalls muss der Benutzer lange warten und es besteht die Gefahr, dass die Ausführungszeit von PHP Max Script das Skript stoppt.

0

InnoDB ist in vielerlei Hinsicht eine viel komplexere, funktionsreiche Engine als MyISAM. Das macht es langsamer und es gibt nicht viel, was Sie in Ihren Abfragen, Konfigurationen oder auf andere Weise tun können. Allerdings versucht MySQL, die Lücke mit den letzten Updates zu schließen.

Blick auf Version 5.6:

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

Ihre beste Wette Ihre Version von MySQL sein kann, aktualisieren, wenn Sie hinter sind.

1

Eine Tabelle beim Crawlen beim Einfügen und Aktualisieren kann darauf hindeuten, dass Sie mit Ihren Indizes ein wenig davongetragen haben. Denken Sie daran, dass die Datenbank nach jedem Commit die Indizes stoppen und neu kompilieren muss.

0

InnoDB bietet die Möglichkeit, Beziehungen und Einschränkungen zu erstellen, die die Datenbank schneller machen, und Sie können mit diesen Beziehungen Modelle & erzeugen.

Sie könnten auch in Betracht ziehen, die Abfragen in kleinere aufzuteilen und sie nacheinander auszuführen.

0

Wie MySQL-Spezialisten sagen, verwenden Sie InnoDB, bis Sie explizit nachweisen können, dass Sie MyISAM benötigen. Leistungsprobleme sind kein gutes Argument.

Wenn Sie große Anwendung haben, werden Sie wahrscheinlich Probleme mit Sperren auf Tabellenebene und Dateninkonsistenz haben. Verwenden Sie also InnoDB.

Ihr Leistungsproblem kann mit dem Fehlen von Indizes oder der Festplatte und deren Dateisystemproblemen zusammenhängen.

Ich arbeitete mit Tabellen mit Hunderten von Millionen Zeilen, die ständig aktualisiert und von mehreren Verbindungen eingefügt wurden. Diese Tabellen hatten InnoDB-Engine.

Natürlich haben Sie Daten, die in einem Bündel hinzugefügt werden sollten, fügen Sie sie mit einer Insert-Anweisung hinzu.