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

Wählen Sie eine Abfrage mit drei Bedingungen aus, wobei die Bedingungen langsam sind, aber dieselbe Abfrage mit einer beliebigen Kombination von zwei der drei Bedingungen, bei denen die Bedingungen schnell sind

Versuchen Sie, das vorhandene SQL in zwei Teile aufzuteilen, und sehen Sie, wie die Ausführungszeiten für jeden sind. Dies würde Ihnen hoffentlich sagen, welcher Teil für die Langsamkeit verantwortlich ist:

Teil 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

und Teil 2 (beachten Sie hier die innere Verbindung):

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

Ich gehe davon aus, dass Teil 2 länger dauern wird. Dabei denke ich, dass ein Index sowohl auf table_1 als auch auf table_2 auf date_coll helfen würde.

Ich glaube nicht, dass der zusammengesetzte Index bei Ihrer Auswahl helfen würde.

Es ist jedoch schwer zu diagnostizieren, warum die drei Bedingungen zusammen die Leistung so stark beeinträchtigen würden. Es scheint mit Ihrer Datenverteilung zusammenzuhängen. Bei mySql bin ich mir nicht sicher, aber in Oracle würde eine Statistiksammlung für diese Tabellen einen Unterschied machen.

Hoffe es hilft.