次のようにテーブル構造が不要な情報を除外(関係を持つすべてのリストではない):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自身が/最小限の遅さではないにもかかわらず、コードの実行に完全な時間を追加する理由を見ることができますか?
あなたは 'DB toSql'inを使用しようとしました::生のクエリがいるかどうかを確認するためにその順序によっては、このような問題を引き起こすだろうが、それは手で問題を回避する方法を答えるんなぜこれが答えていませんEloquentクエリービルダーの問題なのですか? – fmgonzalez
Eloquentは便宜のためにスピードを犠牲にしています。 – mkaatman
しかし、この注文については、そのような遅れを引き起こします。 –