Doctrine Bei der Verknüpfung von zwei Modellen mit der Vererbung einzelner Tabellen wird der zweite Join verlangsamt

8

Ich habe 3 Modelle, die Single Table Inheritance verwenden. Sie sind für drei verschiedene Arten von Produkten, die auf unserer Website erworben werden können. Die Elemente werden in Kategorien platziert, sodass das Kategoriemodell über eine Eigenschaft zum Zuordnen jeder der drei Typen verfügt.

Wenn Sie eine einfache Option verwenden, um alle Kategorien abzurufen und dann deren Namen und die Nummer jedes Elementtyps in der Kategorie anzuzeigen, führt Doctrine 361 Abfragen in insgesamt 549 ms aus. (Eine für die Liste der Kategorien und dann eine für jeden Typ innerhalb der Kategorie.)

Also habe ich angefangen, Joins zur Abfrage hinzuzufügen, um alle zusätzlichen Abfragen zu eliminieren. Es funktionierte gut für den ersten Elementtyp, die Hauptabfrage läuft in 101.80 ms. (Entsprechend der Symfony Profiler Toolbar)

%Vor%

Sobald ich den zweiten Join hinzufüge, verlangsamt sich die Abfrage auf 24050.14 ms

%Vor%

Ich habe noch nicht einmal mit dem dritten Join versucht, aus Angst, es würde nur den Server zum Absturz bringen.

Was wirklich seltsam ist, ist, wenn ich Doctrine Query Logging benutze und die genaue Abfrage erhalte, und sie manuell für meine DB ausführe, läuft sie nur in .2 Sekunden.

Die Tabelle enthält Indizes für alle FK-Spalten und die Diskriminatorspalte.

Jeder Rat würde sehr geschätzt werden. Danke!

Bearbeiten: 4/3

Ich musste den Zweig zurück zu einem Arbeitspunkt für andere Probleme bringen, um auf dieses Problem zurückzukommen.

SQL Fiddle mit Schema (abzüglich der FKs für andere Tabellen, die in dieser Situation nicht geladen sind): Ссылка

Also, ich habe die Seite ohne Join und 382 Abfragen in 820.38 ms für Lazy-Loading. Wenn ich mich manuell verbinde, anstatt mich auf das Lazy-Loading zu verlassen, ist es 13015 21159 (Dies verbindet nur zwei der Modelle, also lädt es immer noch das dritte)

%Vor%

Hier ist die Abfrage von der Symfony-Symbolleiste (20241.26 ms)

%Vor%

UND die Erklärung dafür:

%Vor%

* PHP *

Dies ist das Mapping im Items-Modell:

%Vor%

Und die Abbildungen auf dem Kategoriemodell

%Vor%     
Jessica 29.03.2014, 20:52
quelle

2 Antworten

1

Der Unterschied zwischen Objekten und Attributen gegenüber Zeilen und Spalten spielt hier keine Rolle.

Sie versuchen eine Reihe von LEFT JOIN s zu erstellen, wo Sie wahrscheinlich UNION s verwenden sollten.

Siehe Microsofts Übernahme für CROSS JOIN und Kartesische Produkte. Sie fassen es wirklich gut zusammen.

BEARBEITEN: Ich denke, das beantwortet die Frage "Warum ist meine zweite Verbindung langsam?".

Sie wollten fragen: "Bitte helfen Sie mir, meine Doctrine-Abfrage für 3 Modelle in weniger als 550 ms zu verbessern." ?

    
user645280 15.04.2014, 21:03
quelle
1

Ich werde es in einfachen Worten erklären. Ich glaube, Sie versuchen, 3 Tabellen mit dem Namen item in item category in die Positionstyp-Zuordnung aufzunehmen also wahrscheinlich etwas wie:

%Vor%

Dies verbindet item über die Zwischentabelle item category mit Positionstypzuweisung . Da die Verknüpfung zwischen Artikel und Artikelkategorie ein LINKER JOIN ist, erhalten Sie alle Artikeldatensätze.

Was ist eine Alternative:

%Vor%     
yoostink 08.04.2014 11:26
quelle