Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrageoptimierung mit Case-Anweisung

Der case Anweisung fügt Zeit hinzu, weil sie durchsucht wird.

Die Lösung? Speichern Sie die Paare in einer temporären Tabelle. . . mit Index. Also:

create temporary table code_pairs (
    old_code varchar(255) not null primary key,
    new_code varchar(255)
);

insert into code_pairs(old_code, new_code)
    values ('akdsfj', 'kadjsf'),
           ('asdf', 'ndgs'),
           . . . ;

Verwenden Sie dann update mit join :

update test_table tt join
       code_paris cp
       on tt.code = cp.old_code
    set tt.code = cp.new_code;

Dadurch sparen Sie Zeit, da der passende Code über den Index gefunden wird, anstatt einen case einzeln zu durchsuchen Aussage. Außerdem wird für Zeilen, die keine Übereinstimmung aufweisen, keine Aktualisierung versucht. Die 170.000 Zeilen ohne Übereinstimmung sind wahrscheinlich der langsamste Teil der Abfrage, da sie die gesamte Liste von case durchlaufen müssen Werte.