簡體   English   中英

如何使用laravel加速Mysql查詢

[英]How can I Speed up Mysql query using laravel

具有慢功能的Webapp。

我要求建議使用代碼將此功能從5-6秒加速到1-2秒。

我有帶有表的數據庫:

表格:工作人員(編號,名字,姓氏)

表格:商店(編號,名稱)

表格:worker_store(id,worker_id,store_id)

這個想法是通過worker_store表將worker連接到單個或多個商店。

在Laravel應用程序中,我有一個可以接收單個商店並顯示工作人員已連接到該特定商店的功能。 必須將其顯示為“選擇”字段,並將已連接的工作程序標記為“已選擇”,並將所有其他工作程序標記為未選擇。 我的Laravel刀片代碼如下所示

<select multiple name="workers[]" id="workers" class="form-control">
 @foreach (App\Worker::orderBy('last_name')->get() as $worker)                               
  <option value="{{$worker->id}}" 
  **@if ($object->hasWorker($worker->id))                                    
   selected @endif**>{{$worker->getName()}}
  </option>           
@endforeach  


</select>

數據庫是MySQL,工作表有30,000條記錄。 當laravel向數據庫發出30 000個單獨的查詢以檢查每個工作人員是否鏈接到特定商店時,這非常慢(上面代碼的粗體部分)。

請提出一種不需要查詢3萬次數據庫並在不超過1-2秒的時間內完成填充的解決方案(當前代碼大約需要5-6秒)。

要在視圖中放很多東西,但這是我認為您正在尋找的基本概念...

// Grab all the workers so that we can loop through them.
$workers = App\Worker::all();

// Grab a list of the worker id's for the store we are currently searching for.
$storeWorkers = App\Store::with('workers')->find(1)->workers->lists('id');

// Use in_array to determine if the worker is currently working in the store we are looking at.
@foreach ($workers as $worker)
    <option value="{{ $worker->id }}" {{ in_array($worker->id, $storeWorkers) ? 'selected' : '' }}>{{ $worker->name }}</option>
@endforeach

這應該使您總共獲得3個查詢。 1個要抓住所有工人,2個要按商店抓住工人。

看來您的模型設置不正確。 在您的Store模型中,添加功能...

public function workers()
{
    return $this->belongsToMany(Worker::class, 'worker_store');
}

我認為您應該重新考慮如何制作此應用程序。

選擇中有30k個選項沒有意義,誰會去檢查select中的30k個選項以檢入和檢出選項? 誰會讀那些選項?
這是沒有意義的,是無法使用的應用程序。 以及為什么您要創建一個沒人能使用的應用程序?

首先,您需要考慮問題,然后是如何解決問題,您的解決方案實際上將如何幫助某人解決問題,而不是引起更復雜的問題。 扔掉所有數據並不是解決任何問題的方法。

您可能應該考慮AJAX / React / Vue.js或類似的前端事物,它允許用戶以有意義的方式與數據進行交互。

但是,這需要時間,因此,您至少可以通過創建一個頁面來快速解決問題,該頁面可以根據名稱或其他內容過濾工作人員,然后使用分頁,每個選項旁邊都有一個復選框,指示是否選中否,並允許選擇其他選項,或者代替復選框,使用指示當前狀態的顏色或圖標,以及用於添加/刪除它的按鈕。

這樣,用戶可以以更合適和可行的方式搜索所需的選項,瀏覽內容,更改內容。

注意:此外,還要確保數據庫中與其他數據相關的每一列,您訂購的每一列以及用於過濾的每一列都具有索引。

您的問題不只是查詢,而是您在HTML中拋出的海量數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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