2014-04-24 6 views
5

Ist es schneller, mehrere Spalten in einer Abfrage hinzuzufügen oder zu löschen, anstatt eine Abfrage für jede Spalte auszuführen? Zum Beispiel ist das:Ist es schneller, mehrere Spalten in derselben Abfrage zu ändern?

ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d; 

schneller als das?

ALTER TABLE t2 DROP COLUMN c; 
ALTER TABLE t2 DROP COLUMN d; 
+0

Machst du diese Operation intensiv und unter harter Last? –

+0

@Bencaine Ist es wichtig? Ich meine, wie oft wirst du das machen müssen. Fast nie, oder? – Strawberry

+1

Messen Sie es und finden Sie heraus ... –

Antwort

3

Ja, es ist schneller. Sie müssen nur einen Aufruf an die Datenbank-API senden und müssen die Abfrage nur einmal analysieren.

Jedoch, für ALTER TABLE Abfragen, Leistung ist in der Regel kein Problem. Sie sollten dies nicht häufig tun, nur wenn Sie Ihr Schema neu gestalten.

Aber wenn Ihre Frage etwa UPDATE Abfragen wäre, wäre es zum Beispiel wahrscheinlich signifikant. Z.B. Sie tun sollten:

UPDATE table 
SET col1 = foo, col2 = bar 
WHERE <condition>; 

statt

UPDATE table 
SET col1 = foo 
WHERE <condition>; 

UPDATE table 
SET col2 = bar 
WHERE <condition>; 
6

Ja, es sollte schneller sein, eine einzelne Anweisung ALTER TABLE als zwei laufen.

In meiner Erfahrung (mit InnoDB auf 5.1 und 5.5), scheint MySQL die Tabelle "in Stelle" nicht zu ändern. MySQL erstellt tatsächlich eine neue Tabelle als Kopie der alten Tabelle mit den angegebenen Änderungen.

Zwei separate Anweisungen erfordern, dass MySQL diesen Kopiervorgang zweimal durchführt.

Mit einer einzigen Anweisung geben Sie MySQL die Möglichkeit, alle Änderungen mit nur einem Kopiervorgang vorzunehmen. (Ich kenne die Details der MySQL-Interna nicht, aber es ist möglich, dass MySQL die Kopie tatsächlich zweimal ausführt.)

Andere Datenbank-Engines (MyISAM et al.) Können anders verarbeitet werden.


Ich glaube, die InnoDB-Plugin und/oder neuere Versionen von InnoDB in MySQL (> 5.5) haben einige Algorithmen andere als die „Kopie“ Methode, zumindest für einige Veränderungen, die für die Tabelle, damit noch verfügbar sein, während ALTER TABLE ausgeführt wird (für Leseabfragen). Aber ich kenne nicht alle Details.

Verwandte Themen