SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1
Es gibt einen Index für (ExternalProductId, SourceId, AnotherField). Ein Explain zeigt an, dass der Index verwendet wird. Dies wird in der „Extra“ Spalte gedruckt von erklären:Warum kopiert die folgende Abfrage Tabellendaten?
Using where; Using index; Using temporary; Using filesort
Wenn ich die Abfrage, die ich über SHOW PROCESS sehen laufen:
Copying to tmp table on disk
Kann ich diese Abfrage zwicken an seinem Platz auf dem Index zu arbeiten? Es macht mir auch nichts aus, wenn die Ergebnisse etwas ungenau sind, weil andere Prozesse gleichzeitig an dieser Tabelle arbeiten. Kann ich die Isolationsstufe ändern, um die Leistung der Abfrage zu erhöhen?
Ich denke, Sie haben einige Missverständnisse. Eine temporäre Tabelle bedeutet nicht, dass sie alle Daten aus der Tabelle kopiert, um ihre Arbeit zu erledigen. Es bedeutet nur das Kopieren eines Zwischenergebnisses in eine temporäre Tabelle zur weiteren Verarbeitung. Die temporäre Tabelle enthält wahrscheinlich alle Datensätze, bei denen die ExternalProductID nicht null ist, und die Spalte cnt, um die Klausel 'HAVING' auszuwerten. Zweitens hat die Transaktionsisolation nichts mit temporären Tabellen zu tun. – bot403
@ bot403 - Ich habe gerade mit unserem DBA gesprochen und er stimmt dir zu. Ich glaube, Ihr Kommentar ist die bisher beste Antwort auf diese Frage. – ripper234
Ja, ich denke, die Antwort ist sowohl mein # 1 als auch Ajreals Indexvorschlag. – bot403