2017-03-27 5 views
2

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?

+0

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

+0

Eloquent opfert Geschwindigkeit für Bequemlichkeit. – mkaatman

+0

Aber was ist mit dieser Reihenfolge, verursacht eine solche Verlangsamung. –

Antwort

0

Es scheint, als würde die Abfrage roh und hydratisieren und laden scheinen die Abfrage zu beschleunigen. Dieser antwortet nicht, warum das, um durch ein solches Problem verursachen würde, aber es beantwortet, wie um die Frage auf der Hand zu bekommen:

$products = self::hydrate(DB::select(
    "select `products`.*, COUNT(product_view_history.id) as view_count 
    from `products` left join `product_view_history` 
    on `product_view_history`.`product_id` = `products`.`id` 
    where `products`.`launch_date` is not null 
    group by `product_view_history`.`product_id` 
    order by `view_count` desc, `products`.`id` desc limit {$limit}")) 
    ->load(['owner.images', 'owner.star', 'owner.follows', 'owner.followers', 'company.products.alphas']);