簡體   English   中英

簡單查詢在 Laravel 中很慢(帶分頁)但在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM