Mysql
 sql >> Base de données >  >> RDS >> Mysql

Exclure les enregistrements où la sous-requête renvoie des résultats qui doivent être mutuellement exclusifs

Et c'était moche. Cela fonctionne bien jusqu'à ce qu'il y ait une autre charge importante sur la base de données, puis tout se passe très lentement. Cela est principalement dû aux limitations d'E/S du serveur, mais l'approche la plus simple consistait à obtenir isfiction et isNonFiction dans les tables MEMORY et l'instruction DELETE peut alors ressembler à :

    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

Lors des tests, cela réduit l'ensemble du processus d'environ 90 secondes à 10 secondes.