sql >> Database >  >> RDS >> Mysql

query-optimalisatie met case-statement

De case statement voegt wel tijd toe, omdat het wordt doorzocht.

De oplossing? Bewaar de paren in een tijdelijke tabel. . . met een index. Dus:

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

Gebruik dan update met join :

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

Dit bespaart u tijd omdat de overeenkomende code wordt gevonden met behulp van de index, in plaats van één voor één te zoeken via een case uitspraak. Bovendien wordt er geen update geprobeerd op rijen die geen overeenkomst hebben. De 170.000 rijen zonder overeenkomst zijn waarschijnlijk het langzaamste deel van de zoekopdracht, omdat ze de hele lijst met case moeten doorlopen waarden.




  1. Hoe kan ik alle sessies die verbinding maken met mijn Oracle-database beëindigen?

  2. Hoe de huidige rijwaarde in modaal door te geven?

  3. Sessies opslaan in DB-tabel werkt niet (met Zend_Session_SaveHandler_DbTable)

  4. json_encode met mysql-inhoud en umlauts in utf-8