Mysql
 sql >> Database >  >> RDS >> Mysql

ottimizzazione della query con istruzione case

Il case l'istruzione aggiunge tempo, perché viene cercata.

La soluzione? Memorizzare le coppie in una tabella temporanea. . . con un indice. Quindi:

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'),
           . . . ;

Quindi usa update con join :

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

Questo ti fa risparmiare tempo perché il codice corrispondente viene trovato usando l'indice, invece di cercare uno per uno attraverso un case dichiarazione. Inoltre, non viene tentato alcun aggiornamento sulle righe che non hanno corrispondenze. Le 170.000 righe senza corrispondenza sono probabilmente la parte più lenta della query, perché devono scorrere l'intero elenco di case valori.