sql >> Databasteknik >  >> RDS >> Mysql

frågeoptimering med case statement

case uttalandet lägger till tid eftersom det söks.

Lösningen? Förvara paren i ett tillfälligt bord. . . med ett index. Så:

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

Använd sedan update med join :

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

Detta sparar tid eftersom den matchande koden hittas med hjälp av indexet, istället för att söka en efter en genom ett case påstående. Dessutom görs ingen uppdatering på rader som inte har någon matchning. De 170 000 raderna utan matchning är förmodligen den långsammaste delen av frågan, eftersom de måste gå igenom hela listan med case värden.




  1. unaccent() förhindrar indexanvändning i Postgres

  2. Hur man formaterar negativa tal med vinkelparenteser i Oracle

  3. MySQLdb-fråga till Numpy-array

  4. Hur kan jag använda ADO.NET DbProviderFactory med MySQL?