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

Können Sie Unterabfragen indizieren?

Zunächst müssen Sie wissen, dass das Erstellen einer temporären Tabelle absolut eine praktikable Lösung ist. Aber in Fällen ist keine andere Wahl anwendbar, die hier nicht zutrifft!

In Ihrem Fall können Sie Ihre Suchanfrage ganz einfach als FrankPl verstärken darauf hingewiesen, weil Ihre Unterabfrage und Hauptabfrage beide nach demselben Feld gruppiert sind. Sie benötigen also keine Unterabfragen. Ich werde die Lösung von FrankPl der Vollständigkeit halber kopieren und einfügen:

SELECT o.property_B, SUM(o.score1), SUM(o.score2)
FROM o
GROUP BY property_B;

Dies bedeutet jedoch nicht, dass es unmöglich ist, auf ein Szenario zu stoßen, in dem Sie wünschen, Sie könnten eine Unterabfrage indizieren. In diesen Fällen haben Sie zwei Möglichkeiten:Erstens verwenden Sie eine temporäre Tabelle, wie Sie selbst darauf hingewiesen haben, die die Ergebnisse der Unterabfrage enthält. Diese Lösung ist vorteilhaft, da sie seit langem von MySQL unterstützt wird. Es ist einfach nicht machbar, wenn es um riesige Datenmengen geht.

Die zweite Lösung ist die Verwendung von MySQL Version 5.6 oder höher . In neueren Versionen von MySQL sind neue Algorithmen integriert, sodass ein Index, der für eine Tabelle definiert ist, die innerhalb einer Unterabfrage verwendet wird, auch außerhalb der Unterabfrage verwendet werden kann.

[AKTUALISIEREN]

Für die bearbeitete Version der Frage würde ich die folgende Lösung empfehlen:

SELECT o.property_B, SUM(IF(o.property_A = 'specific_A', o.score1, 0)), SUM(o.score2)
FROM o
GROUP BY property_B
HAVING SUM(IF(o.property_A = 'specific_A', o.score1, 0)) > 0;

Aber Sie müssen am HAVING arbeiten Teil. Möglicherweise müssen Sie es entsprechend Ihrem tatsächlichen Problem ändern.