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

Ausschließen von Datensätzen, bei denen die Unterabfrage Ergebnisse zurückgibt, die sich gegenseitig ausschließen müssen

Und es war hässlich. Es funktioniert gut, bis es eine andere signifikante Belastung der DB gibt, und dann geht alles sehr langsam. Dies liegt hauptsächlich an IO-Beschränkungen des Servers, aber der einfachere Ansatz war, isfiction und isNonFiction in die MEMORY-Tabellen zu bekommen und die DELETE-Anweisung kann dann so aussehen:

    DELETE tmp_table FROM tmp_table
         INNER JOIN
         (
            SELECT ASIN, MAX( isFiction ) AS isFiction, MAX( isNonFiction ) AS isNonFiction
            FROM tmp_table
            GROUP BY ASIN
            HAVING isFiction =1
            AND isNonFiction =1
         ) D
         WHERE D.ASIN=tmp_table.ASIN AND tmp_table.isNonFiction=1

Beim Testen wird der gesamte Prozess dadurch von etwa 90 Sekunden auf 10 Sekunden verkürzt.