unnötige Informationen Weglassen der Tabellenstruktur ist wie folgt (Auflistung nicht alle mit Beziehungen):Laravel orderBy Verlangsamung Reaktion stark
products
id
launch_date
name
product_view_history
id
account_id
product_id
timestamps
ich Abfrage haben, und unregelmäßig lange Zeit, stattfindet. Mit all der Profilierung ich getan habe, ist die tatsächliche Zeit verbrachte in SQL sehr klein (<50 ms
), aber die Zeit ist dieser Code in dem 900+ms
Bereich auszuführen nimmt:
$this->select('products.*', DB::raw('COUNT(product_view_history.id) as view_count'))
->leftJoin('product_view_history', 'product_view_history.product_id', '=', 'products.id', 'outer')
->groupBy('product_view_history.product_id')
->orderBy('view_count', 'DESC')
->orderBy('products.id', 'DESC')
->whereNotNull('products.launch_date')
->with(['owner.images', 'owner.star', 'owner.follows', 'owner.followers', 'company.products.alphas'])
->take(Config::get('xxxx.limits.small'))
->get();
jedoch die Zeit, die für diesen Code dauert zur Ausführung wird die entsprechende <50ms
reduziert, wenn ich ->orderBy('view_count', 'DESC')
auskommentieren. Wenn ich get()
mit toSql()
austausche und diese beiden Abfragen manuell ausführe, finde ich, dass die Zeiten relativ ähnlich und klein sind. Um die benötigte Zeit zu messen, ist keine SQL-Abfragezeit erforderlich. Ich erhalte nur die Zeit in Millisekunden und unmittelbar danach und protokolliere den Unterschied.
Kann jemand irgendeinen Grund sehen, warum ->orderBy('view_count', 'DESC')
würde fast eine volle Sekunde der Zeit zur Ausführung von Code hinzufügen, obwohl die SQL selbst ist nicht/minimal langsamer?
Haben Sie versucht, die 'toSql'in einer DB zu verwenden: roh Abfrage zu überprüfen, ob es ist nur eine Frage des Eloquent Query Builders? – fmgonzalez
Eloquent opfert Geschwindigkeit für Bequemlichkeit. – mkaatman
Aber was ist mit dieser Reihenfolge, verursacht eine solche Verlangsamung. –