2013-07-09 7 views
5

Ich habe gerade die Leistung Eloquent ORM in Laravel getestet und war schockiert, eine einfache Abfrage über mehr als 3 Sekunden zu finden, verglichen mit der normalen Laravel-Abfrage, die in 0,1 Sekunden endete. Ich gebe nur 1500 Datensätze zurück.Eloquente ORM Leistung

DB::table('t_organisations')->get(); - 0.12253594398499 seconds 
Organisation::all(); - 3.6389181613922 seconds 

Sicher kann das nicht normal sein !? Ich glaube nicht, dass ich etwas im Setup verpasst habe. Meine db ist normalisiert. Was könnte das Problem sein?

+0

Ich persönlich würde es durch XDebug laufen, um zu sehen, wo die Zeitverschwendung ist. –

+1

Haben Sie Beziehungen in Ihrem Modell definiert? Wenn ja - Eloquent müsste viele Joins machen ... – Laurence

+0

Es gibt immer etwas, das am besten Query Builder verwendet, besonders wenn es um große Datenmengen geht. – crynobone

Antwort

2

Vielen Dank für Ihre Antworten.

Hier ist das Ergebnis des MySQL-Query-Log:

Organisation :: alle(); - 1,6772060394287 Sekunden

130710 9:52:43  5 Connect [email protected] on seltec 
      5 Prepare set names 'utf8' collate 'utf8_unicode_ci' 
      5 Execute set names 'utf8' collate 'utf8_unicode_ci' 
      5 Close stmt  
      5 Prepare select * from `users` where `id` = ? limit 1 
      5 Execute select * from `users` where `id` = '2' limit 1 
      5 Close stmt  
      5 Prepare select * from `t_organisations` 
      5 Execute select * from `t_organisations` 
130710 9:52:44  5 Close stmt  
130710 9:52:45  5 Quit 

DB :: Tabelle ('t_organisations') -> get(); - ,13963603973389 Sekunden

130710 9:55:16  6 Connect [email protected] on seltec 
      6 Prepare set names 'utf8' collate 'utf8_unicode_ci' 
      6 Execute set names 'utf8' collate 'utf8_unicode_ci' 
      6 Close stmt  
      6 Prepare select * from `users` where `id` = ? limit 1 
      6 Execute select * from `users` where `id` = '2' limit 1 
      6 Close stmt  
      6 Prepare select * from `t_organisations` 
      6 Execute select * from `t_organisations` 
      6 Close stmt  
      6 Quit 

So gibt es keinen Unterschied dann ...., die die Verzögerungsmittel müssen in der Eloquent PHP-Code liegen. Ja, ich habe xdebug installiert und nein, ich bin nicht bereit, meine Zeit damit zu verschwenden, herauszufinden, warum es langsam ist !!! Wenn es im Query Builder schneller ist, ist das gut genug für mich !!

@Laravels 'Entwickler: gute Arbeit am Framework. Es ist intuitiv, beschäftigt sich mit Autorisierungen gut, vor allem mit den Confion- und Entrust-Plugins von Leroy Merlin. Vielleicht möchten Sie sich jedoch das Eloquent-Performance-Thema ansehen !!

Prost! Craig

+0

Was meinst du Leroy Merlin? Entrust und Confide wurden von Zizaco [link] geschrieben (https://github.com/Zizaco/confide) –

+0

Eloquent sitzt oben auf Query Builder und analysiert die Daten, die es in Klasseninstanzen zurückgibt.Dies ist immer langsamer als die Verwendung nur des Abfrage-Generators. Sie können Eloquente Ergebnisse mit "Organization :: all() -> remember (5);" zwischenspeichern. – assertchris

2

Stellen Sie sicher, dass Sie einen RESET QUERY CACHE ausführen, um Ihren MySQL Query Cache zwischen den Tests zu löschen. Von den Zeitstempeln, die Sie gepostet haben, sieht es so aus, als hätten Sie zuerst die Eloquent-Abfragen ausgeführt, was bedeutet, dass sie wahrscheinlich zu der Zeit im Cache waren, als Sie den zweiten Test durchgeführt haben. Das würde das enorme Leistungsgefälle erklären, obwohl ich aufgrund des zusätzlichen Overheads den Eindruck habe, dass Eloquent ein wenig langsamer ist als normale Laravel-Abfragen.

2

Wenn Sie DB::table('t_organisations')->get(); tun holt es alle Ergebnisse als ein Array (oder Objekte), aber nicht Hydrat sie nicht auf das Modell. Eine schnelle Erklärung finden Sie unter this stackoverflow answer.

Wenn Sie das tun Organisation::all(); Der Trinkprozess stattfindet, weshalb die Anforderung länger dauert (Sie müssen alle Objekte im Speicher zuzuweisen und füllen sie mit den Feldern). Es gibt viele Links/Tuts zur Hydrationsoptimierung, die Ihnen helfen, Ihre Datenbank besser anzufordern und die Hydration von Objekten zu vermeiden, wenn Sie sie nicht benötigen.

Verwandte Themen