2017-03-27 33 views
2

掉不必要的信息表結構如下(不與關係,列出所有):Laravel排序依據減慢響應大大

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

您是否嘗試過使用'toSql'in一個DB:原始查詢檢查這只是一個Eloquent查詢生成器的問題? – fmgonzalez

+0

爲了方便,雄辯犧牲速度。 – mkaatman

+0

但是這個orderBy怎麼樣導致這樣一個減速。 –

回答

0

看起來像執行查詢原始和水合和加載似乎加快查詢。這不回答爲什麼通過這種命令將導致這樣的問題,但它並回答如何解決這個問題手頭:

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