Frage

SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1

Es gibt einen Index (externalProductid, SourceId, ein anderes Feld). Eine Erklärung zeigt, dass der Index verwendet wird. Dies ist in der Spalte "Extra" von Explary gedruckt:

Using where; Using index; Using temporary; Using filesort

Wenn ich die Abfrage ausführe, sehe ich per Showprozesslist:

Copying to tmp table on disk

Kann ich diese Abfrage so optimieren, dass sie im Index an Ort und Stelle gearbeitet haben? Es macht mir auch nichts aus, wenn die Ergebnisse, die ich bekomme, aufgrund anderer Prozesse, die gleichzeitig an dieser Tabelle arbeiten, etwas ungenau sind - kann ich das Isolationsniveau ändern, um die Leistung der Abfrage zu erhöhen?

War es hilfreich?

Lösung

Wenn Sie die Spalten in Ihrem umkehren GROUP BY Um der Reihenfolge der ersten beiden Felder Ihres zusammengesetzten Index zu entsprechen, wird Ihr zusammengesetzter Index viel effektiver verwendet.

SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY ExternalProductId, SourceId
HAVING cnt > 1

Ihre Abfrageausführung sollte sich in sich verwandeln 'Using where; Using index', und entfernen Sie sowohl die temporäre Tabelle als auch die von der andere verursachte Dateiort GROUP BY.

Sie werden immer noch die gleichen Ergebnisse erzielen, aber es wird in einer etwas anderen Reihenfolge sein.

Andere Tipps

Ein paar Dinge zu versuchen:

  1. MySQL sortiert automatisch mit einer Gruppe nach. Wenn Sie sich nicht für die Sortierreihenfolge interessieren, fügen Sie eine Bestellung von Null hinzu. Dadurch wird die Dateiort und möglicherweise die TEMP -Tabelle herausgenommen.

  2. Entfernen Sie die Anzahl (*) und verwenden Sie den Namen einer Spalte im Index anstelle der Wildcard.

Ebenfalls. Was ist dein Index? Können Sie uns die vollständige Erstellung von Tabellen erstellen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top