2011-01-13 11 views
5

Nehmen wir an, dass ich eine Tabelle mit zwei Spalten A und B haben Es ist ein Index auf Spalte A, aber nicht auf der Spalte B Ich möchte mehrere Millionen Anfragen zur Ausgabe wie:MySql UPDATE-Optimierung?

UPDATE t1 SET b=b1 WHERE a=a1; 
UPDATE t1 SET b=b2 WHERE a=a2; 
.... 

Es überall sind aus 1 bis 100.000 Zeilen, die jedem eindeutigen Wert von a entsprechen. Im Durchschnitt ist es um 100.

Für jede Update-Anweisung im Durchschnitt werden 60% der Zeilen nicht geändert, weil für diese Zeilen b bereits den gewünschten Wert hat. Bei 30% der Aktualisierungen wird keine der übereinstimmenden Zeilen geändert.

Macht es Sinn, solche Aussagen zu verwenden?

UPDATE t1 SET b=b1 WHERE a=a1 AND b<>b1; 

Wird es den Prozess Speedup durch unnötiges Rückschreiben auf der Festplatte zu beseitigen oder Mysql 5 klug genug, dass nichts zu erkennen, wird geändert und es besteht keine Notwendigkeit, die Platte zu schreiben zurück?

Antwort

4

In beiden Fällen sind zu kombinieren gedacht, wird MySQL das lesen müssen Zeileninhalt (ob auf der Festplatte oder in einem Cache/Pufferpool). In jedem Fall wird MySQL Ihren Index auf a als Ausgangspunkt verwenden. In beiden Fällen wird MySQL die Zeile nicht aktualisieren, wenn sie bereits den Zielwert für b hat. Folglich sehe ich keine Möglichkeit, wie MySQL von der Klausel b<>b1 profitieren könnte.

Argumentieren, je nach Auslastung und Datenmenge, die Abfrage (mit b<>b1 in it) Macht davon profitieren, wenn Sie Ihren Index auf a ändern eine Verbindung Index auf a und b (in dieser Reihenfolge) zu sein. In diesem Fall müsste die Festplatte nicht gefunden werden (oder der Cache/Pufferpool überprüft werden), um herauszufinden, welche Zeilen insbesondere einer Aktualisierung bedürfen (d. H., Sie würden die von Ihnen erwähnten 30% und 60% groß schreiben). Nachdem das gesagt wurde, benötigt Ihr Index jetzt ein Update für jedes Update auf b, so dass ein Preis ist, obwohl ich vermute, dass der Kompromiss es wert sein könnte.

0

Sie sollten den zusätzlichen Filter hinzufügen. Mysql ist schlau genug, um einen Wert nicht zu aktualisieren, wenn es gleich ist, aber es ist besser, diese Überprüfung zu beseitigen. Sie können dies bestätigen, indem Sie sehen, wie viele Zeilen von der Abfrage "betroffen" waren.

0

ich mehrere Updates in einzelne Update mit CASE

update t1 
set b= 
    case a 
    when a=a1 then b1 
    when a=a2 then b2 
    when a=a3 then b3 ... 
    end; 

Hoffnung dies nützlich, und wenn es schrecklich langsam, bitte explaination