2017-03-27 13 views
2

次のようにテーブル構造が不要な情報を除外(関係を持つすべてのリストではない):Laravel ORDERBYスローダウンレスポンスが大幅に

products 
    id 
    launch_date 
    name 

product_view_history 
    id 
    account_id 
    product_id 
    timestamps 

私は取っているクエリと時間の不規則な長い量を持っています。私がやったすべてのプロファイリングでは、SQLで過ごした実際の時間は、(<50 ms)非常に小さいですが、このコードを実行するのにかかる時間は900+ms範囲内である:

$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(); 

しかし、それは、このコードにかかる時間私が->orderBy('view_count', 'DESC')をコメントアウトすると、適切な<50msが実行されます。私がget()toSql()に置き換えて両方のクエリを手動で実行すると、時間が比較的似て小さくなることがわかります。これが行われている時間を測定するために明確にするには、SQLクエリ時間ではありません。私はちょうどミリ秒前に、そしてこれが行われた直後に時間を得ていて、違いを記録しています。

->orderBy('view_count', 'DESC')は、SQL自身が/最小限の遅さではないにもかかわらず、コードの実行に完全な時間を追加する理由を見ることができますか?

+0

あなたは 'DB toSql'inを使用しようとしました::生のクエリがいるかどうかを確認するためにその順序によっては、このような問題を引き起こすだろうが、それは手で問題を回避する方法を答えるんなぜこれが答えていませんEloquentクエリービルダーの問題なのですか? – fmgonzalez

+0

Eloquentは便宜のためにスピードを犠牲にしています。 – mkaatman

+0

しかし、この注文については、そのような遅れを引き起こします。 –

答えて

0

クエリはrawとhydratingの両方を実行しているようですが、クエリを高速化するようです。

$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']);