j4nk3y: Performance MySQL updaten

Beitrag lesen

Hey,

Wenn du die Werte per Ausdruck in einem SQL-Statement berechnen kannst, also keine externen Daten benötigst, dann kannst du dich auf lediglich ein Update-Statement beschränken. Also gemäß diesem Prinzip:

UPDATE tabelle SET feld = feld + 1;

Doch ich brauch Werte aus 3 anderen Tabellen. Wäre dann die frage ob das mit Joins auch geht? Und leicht modifizierter rechnung etwa:

$a = $o * (1+ $e);
$b = $o * (1- $e);
$d = sqrt(pow($a * cos($alpha), 2) + pow($b * sin($alpha), 2));
$om = sqrt($G * ($sm + $pm) * ((2 / ($d * pow(10, 3))) - (1 / ($a * pow(10, 3))))) / ($o * pow(10, 3));
$alpha += $om * ( 600 ) * $t;

Nur ein paar offensichtliche Dinge kann ich ansprechen:

$get_data = $db->prepare(sprintf('SELECT x,y FROM a')); $get_data->execute();

Das sprintf() hat an der Stelle keinen Nutzen.

Stimmt, im Orginal query jedoch schon.

  $update_data = $db->prepare(sprintf('UPDATE %s SET y = %.20f WHERE id = %d', mysqli_real_escape_string($db, 'table'), $data['y'], $id));

Zudem ist es nicht sinnvoll, die Methode des Zusammenstückeln von Statement und Werten mit Prepared Statements zu mixen, ohne die Eigenschaften von Prepared Statements zu verwenden.

Das Prepared Statement habe ich auch nur eingefügt weil ich das Problem hatte das Zahlen und Floats als String aus der Datenbank kamen. Mittlerweile Versuche ich überall wo ich es nicht mache umzuschreiben.

Wenn du das Statement selbst zusammenbauen möchtest, dann kannst du mysqli_query() statt mysqli_prepare() und mysqli_stmt_execute() nehmen. Das ist kürzer und spart einen Roundtrip zwischen PHP und MySQL. Dann solltest du aber auch das mit dem Maskieren richtig machen. Ein Tabellenname ist kein Wert, sondern ein Identifier. Für Identifier gelten andere Maskierungsregeln als die Funktion mysqli_real_escape_string() berücksichtigt. Üblicherweise stehen Identifier direkt im Statement und werden nicht bei Bedarf hinzugefügt. Vermutlich gibt es deshalb keine vorgefertigte Funktion, mit der man das erledigen könnte.

Tja, dann ist das halt so.

Außerdem fehlt dir zu dem Prepare das Execute. Das Commit ist kein Ersatz und auch nur für Transactions sinnvoll.

Ganz vielleicht nutze ich ja Transactions in der db_connect_function, wer weiß. Und vielleicht wurde das Execute einfach unbeabsichtigt mit gelöscht bei dem simplifizieren des Scripts.

Und die Verbindung selbst zu schließen ist auch nur selten notwendig.

Bei Transactions zwingend notwendig.

Besonders dann nicht, wenn man weitere Statements ausführen möchte und sie dazu wiederherstellen muss.

Vielleicht ist das gerade ein zwischen Schritt den ich eingebaut habe um zu sehen wie lange welcher Teil braucht und anderen Scripten zwischendurch die Möglichkeit zu geben mit der Datenbank zu interagieren.

Die Verbindung wird am Script-Ende bereits von PHP geschlossen.

Stimmt.

Gruß
Jo