2016-09-09 12 views
0

Webappには遅い機能が1つあります。laravelを使用してMySQLクエリを高速化するには

私はこの機能を5〜6秒から1〜2秒の間にスピードアップするコードを提案してください。

表:労働者(ID、Fi回線rst_name、LAST_NAME)

表:店舗(ID、名前)

表:worker_store(ID、worker_id、STORE_ID)

私はテーブルを持つデータベースを持っています

workerは、worker_storeテーブルを介して1つまたは複数の店舗に接続されているという考えがあります。

Laravelアプリでは、1つの店舗を利用し、ワーカーがこの特定の店舗に接続していることを示しています。これは、「選択済み」とマークされた接続された作業者と選択されていない他のすべての作業者の「選択」フィールドとして表示する必要があります。私の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回の個別クエリを実行するのは非常に遅いです。

データベースを30 000回クエリする必要がなく、1〜2秒以内に完全生成を行う必要がないソリューションを提案してください(現在のコードは約5〜6秒かかります)。

+1

に投げているデータの膨大な量であるとしてあなたの問題は、できるだけ多くのクエリではないが、労働者を照会し、使用しているコードを表示します。また、ここを見て... https://laravel.com/docs/5.3/eloquent-relationships#eager-loading – user3158900

+0

mycodeが私の質問にあります。 – Hassaan

+0

@Guanapado PadoなぜDatatableとlaravel paginateを使用しないでください。ここでは、プロジェクトに実装するのに役立つ例を示します。 [https://github.com/yajra/laravel-datatables] [https://datatables.net/examples/server_side/post.html] [https://laravel.com/docs/5.3/pagination] – Manish

答えて

0

これは、ビューに入れることがたくさんあることだろうが、ここで私はあなたが探している何を考えての基本的な考え方だ...

// 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'); 
} 
+0

Thnx、私はあなたの提案したコードを試し、それが動作するかどうかを見ていきます。 – Hassaan

+0

私は$ workersWorksと$ storeWorkersを理解しています...コントローラ と@foreachをブレードテンプレート – Hassaan

+0

にする必要があります。おそらく最も良いでしょう – user3158900

0

このアプリケーションの作成方法を再考する必要があります。

選択肢に30kのオプションがあり、30kオプションを使用してオプションのチェックインとチェックアウトを行うことはできません。誰がそれらのオプションを読むのだろうか?
それは意味をなさない、使用することができないアプリケーションです。そして、誰も使えないアプリケーションを作る理由は何ですか?

まず、問題を考え、問題を解決する方法、問題解決のためにソリューションが実際にどのように役立つか、より複雑な問題を引き起こす必要があります。すべてのデータを投げ捨てることは、何の解決策でもありません。

おそらく、AJAX/React/Vue.jsやそれに類するフロントエンドのことを考えて、ユーザーがデータとのやりとりができるようにする必要があります。

しかし、時間がかかるので、名前や何かに基づいて作業者をフィルタリングしてページを作成し、ページオプションを使用すると各オプションの横にチェックボックスが表示され、選択されているかどうかを示し、追加を選択することを許可するか、またはチェックボックスの代わりに、現在の状態を示す色またはアイコンと、それを追加/削除するボタンとを含む。

ユーザーが望むオプションを検索したり、物事をナビゲートしたり、物事をより適切かつ実行可能な方法で変更することができます。

また、他のデータ、注文するすべての列、フィルタに使用するすべての列に関連するすべての列のインデックスがデータベースに含まれていることを確認してください。

それはあなたがHTML

+0

Sir実際には0.8秒で結果が得られました。これは上記のuser3158900で定義された手順に従っていましたが、今はlaravel socialite pluginに問題があります。助けてください。 laravel socialiteプラグイン。私は質問をしましたが、一人の人はそれに答えませんでした。このリンクをご覧ください。http://stackoverflow.com/questions/39425687/laravel-socialite-doesnt-take-get-parameter-to-私はあなたに感謝するでしょう – Hassaan

+0

非常に良い点を太字で示しています: "あなたがHTMLで投げている大量のデータ" これまでに触れていなければ、それはあなたのサイトを壊滅させ、すべてを再構築するように強制することができます...将来的にどのくらいのデータが表示されるかを意識してください。 。 。 。 。 – Andrew

関連する問題