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

Sélectionnez la requête avec trois où les conditions sont lentes, mais la même requête avec n'importe quelle combinaison de deux des trois où les conditions sont rapides

Essayez de diviser le SQL existant en deux parties et voyez quels sont les temps d'exécution pour chacune. J'espère que cela vous donnera quelle partie est responsable de la lenteur :

partie 1 :

SELECT table_1.id
  FROM table_1
  LEFT JOIN table_2
    ON (table_1.id = table_2.id)
 WHERE table_1.col_condition_1 = 0
   AND table_1.col_condition_2 NOT IN (3, 4)
   AND table_2.id is NULL

et partie 2 (notez la jointure interne ici) :

SELECT table_1.id
  FROM table_1
  JOIN table_2
    ON (table_1.id = table_2.id)
 WHERE table_1.col_condition_1 = 0
   AND table_1.col_condition_2 NOT IN (3, 4)
   AND table_1.date_col > table_2.date_col

Je m'attends à ce que la partie 2 soit celle qui prendra plus de temps. En cela, je pense qu'un index sur table_1 et table_2 sur date_coll serait utile.

Je ne pense pas que l'index composite vous aiderait du tout dans votre sélection.

Cela dit, il est difficile de diagnostiquer pourquoi les trois conditions ensemble auraient un impact si négatif sur les performances. Cela semble être lié à la distribution de vos données. Je ne suis pas sûr de mySql mais dans Oracle, une collecte de statistiques sur ces tables ferait une différence.

J'espère que ça aide.