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本身不是/最低速度?
您是否嘗試過使用'toSql'in一個DB:原始查詢檢查這只是一個Eloquent查詢生成器的問題? – fmgonzalez
爲了方便,雄辯犧牲速度。 – mkaatman
但是這個orderBy怎麼樣導致這樣一個減速。 –