2017-06-09 12 views
0

Ich benutze Symfony mit Doktrin (2.5). Ich habe ausgewählt (aus Symfony Profiler-> Lehre-> Abfragen-> Ansicht Runnalbe Abfrage). Es dauert ~ 200ms über phpMyAdmin oder im Web über Doktrin (selbe Zeit).Lehre viel lange Zeit wie in phpMyAdmin?

SELECT col1, col2 ... col 12, MIN(t0_.price) AS sclr_24 
FROM tablo t0_ 
WHERE t0_.visible = (1) AND t0_.status <> (0) AND t0_.price IS NOT NULL 
GROUP BY t0_.kat_id 
ORDER BY t0_.hotel ASC; 

Aber wenn ich orderBy von PHP entfernen - Lehre wird diese Abfrage generiert: (wie bei vorherigen, aber ohne orderBy)

SELECT col1, col2 ... col 12, MIN(t0_.price) AS sclr_24 
FROM tablo t0_ 
WHERE t0_.visible = (1) AND t0_.status <> (0) AND t0_.price IS NOT NULL 
GROUP BY t0_.kat_id; 

Diese Abfrage Zeit fast vorherige Abfrage, sondern nur auf Web über Lehre nimmt, wenn Ich kopiere diese Abfrage und Einfügen in phpMyAdmin es dauert eine Menge Zeit weniger (~ 20ms).

Können mir einige erklären warum? Oder was ich ändern muss, um die gleiche Zeit wie in phpMyAdmin zu haben?

UPDATE: Code aus dem Repository:

$query = $repository 
    ->createQueryBuilder('t') 
    ->select('t.col1', 't.col2' .... 't.col12', 'MIN(t.price) AS price'); 

$query->where('t.visible = (:visible)')->setParameter('visible', 1); 
$query->andWhere('t.status!= (:status)')->setParameter('splneno', 0); 
$query->andWhere('t.priceis not null'); 

$query->groupBy('t.katId'); 
$result = $query->getQuery()->getArrayResult(); 
+0

fügen Sie bitte einige weitere Informationen und Code, wie genau Sie erstellen und verarbeiten diese Abfrage in Symfony. – lordrhodos

Antwort

0

Die angezeigte Ausführungszeit in 'phpMyAdmin' ist, wie lange die Abfrage auf dem Server ausgeführt hat - es ist richtig und kommt von der MySQL-Engine selbst.

Leider müssen die Ergebnisse dann über das Internet an Ihren Browser gesendet werden, um angezeigt zu werden, was viel länger dauert. "Doctrine2" ist ORM und hat mehr Overhead mit Wrappern und anderen Sachen.

+0

Ja, aber in Symfony Profiler unter 'Doctrine' sind Abfragen für die Anfrage ausgeführt, so spreche ich nicht über GET Anfrage Zeit, sondern über Zeit bei bestimmten Abfrage in Profiler angezeigt + ja Doktrin hat Wrapper und andere Sachen, aber der Unterschied zwischen der zweiten Abfrage ist zu groß in meinem Opinoin. (aus meiner Erfahrung Unterschied kann +/- 5% nicht ~ 1000% etwas ist falsch ...) –

+0

Lehre ORM, wie die meisten ORMs, führt einen Prozess namens Hydration beim Konvertieren von Datenbankergebnissen in Objekte. Bei diesem Prozess wird normalerweise ein Datensatz aus einem Datenbankergebnis gelesen und dann die Spaltenwerte in die Eigenschaften eines Objekts konvertiert. Sie müssen also Doktrin konfigurieren, um die Ausführung von Abfragen zu beschleunigen. Du kannst die Geschwindigkeit um bis zu 70% erhöhen, aber es hängt wiederum davon ab, wie komplex deine Entitäten sind und wie du die Doktrin konfigurierst. Bitte beziehen Sie sich auf [Wie man die Doktrinleistung erhöht] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/improving-performance.html) –

+0

Frage wurde aktualisiert und wenn sich diese Info ändert alles - ich benutze nicht -> getResult() aber -> getArrayResult() –

0

Diese Abfrage wird von einem Repository ausgeführt? Wie ist die Entität mit diesem Repository verknüpft? Ist die Zeit immer noch die gleiche, wenn Sie es außerhalb des Repos ausführen?