[英]Query VERY slow (>30s) in php, but fast when running the query in phpmyadmin
[英]Simple query is slow in laravel (with paginate) but very fast in phpmyadmin
我看過類似的問題,我得到的答案是在我的查詢中設置限制,我做到了。
這是查詢
$sql = DB::table('inventorysku_tb as isku')
->leftJoin('inventorytrackingmodules_tb as itm', function ($join) {
$join->where('itm.coID', '=', 4)
->whereBetween('itm.effectiveDate', ['2021-05-01', '2021-05-31'])
->on('itm.skuID', '=', 'isku.ID');
})
$sql->paginate(25);
return $sql;
這個查詢大約需要 17 秒才能運行,現在如果我在上面的查詢上運行 ->toSql() 並將其粘貼到 phpmyadmin 中(更改 ? 值)
select *
from `inventorysku_tb` as `isku`
left join `inventorytrackingmodules_tb` as `itm`
on `itm`.`coID` = 4
and `itm`.`effectiveDate` between '2021-05-01' and '2021-05-31'
and `itm`.`skuID` = `isku`.`ID`
這個只需要0.2秒就可以在phpmyadmin中運行...
這就是laravel代碼,上面沒有其他代碼......
另一個奇怪的事情是,如果我在 Laravel 中將左連接更改為內連接,則查詢現在很快(878 毫秒)。
根據Laravel 文檔:可以鏈接 On 子句,例如
$join->on('contacts.user_id', '=', 'users.id') ->on('contacts.info_id', '=', 'info.id')
將產生以下 SQL:
on contacts.user_id = users.id and contacts.info_id = info.id
所以,對於你的情況,代碼可能是:
$sql = DB::table('inventorysku_tb as isku')
->leftJoin('inventorytrackingmodules_tb as itm', function ($join) {
$join->on('itm.coID', '=', 4)
->on(function ($query){
$query->whereBetween( 'itm.effectiveDate',['2021-05-01',
'2021-05-31']);
->on('itm.skuID', '=', 'isku.ID');
})
這樣,我認為您可以生成與 phpMyAdmin 中使用的相同的查詢
刪除LEFT
。 由於您限制了WHERE
因此它是JOIN
。
將此添加到itm
: INDEX(coID, skuID, effectiveDate)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.