2017-12-19 10 views
2

DBからデータを取得するたびにデータベース接続を減らすことについて質問があります。私はダッシュボードでは5つのテーブル(通知、受注、ユーザー、製品、取引)Laravel 5.5最適化クエリ

があると、私は示さなければならない:

  • 未読通知
  • 受注統計
  • 製品
  • の数
  • 取引統計

最も簡単な方法(擬似コード):

$notis = Notification::where('unread')->get(); 
$orderStat = Order::join('user')->where('count(order.id)', 'status')->groupby('status'); 
$product = Product::count(); 
$transactions = Transaction::join('user')->where('count(trans.id)', 'status')->groupby('status'); 

私のメンターは、多くの多くのレコードの各テーブルに以上のテーブルを必要とダッシュボード(ないためがあり、このソリューションは、場合には、サーバーのスピーチを減らすだろうと言ったように、私は、4つの別々のクエリを実行する必要があります結合する)を照会する。
Iすでにやった:外部キー列に

  • インデックス
  • 雄弁のためのイーガーローディングそれは
  • (ORレンダリングされたUIの後にデータをロードするために、AJAXを使用して)利用できるかどう

私が欲しいです上記の場合の処理​​時間を短縮する方法はありますか?
また、connection poolに関する他の質問は、速度を上げるために使用すると述べています。調査した後に見つけたLaravelは既に接続プールをしましたか?
編集:
ユーザーには多くの通知、注文、取引があります。
私は、上記で言及していないパフォーマンスを改善する方法を尋ねたいだけです。

+0

を使用してクエリをプロフィールあなたはすべてのテーブル間の関係、またはスキーマを提供することはできますか? – C2486

+0

ユーザーには多くの通知、注文、取引があります。 –

+0

status = count(id)を選択して何を達成しようとしていますか? – fab2s

答えて

3

まずようにする必要があり、あなたの擬似コード修正:

$notis = Notification::where('unread')->get(); 
$orderStat = Order::join('user')->select('count(order.id)', 'status')->groupBy('status'); 
$product = Product::count(); 
$transactions = Transaction::join('user')->select('count(trans.id)', 'status')->groupBy('status'); 

は、私はあなたが考慮に入れることができますいくつかの追加のヒントがあります:

1)は、クエリキャッシュ(クエリキャッシュを使用しないでくださいMySQLの5.7.20で廃止され、およびMySQL 8.0で削除された)

2)能力を向上させるために、あなたのテーブルやSQL ServerのバッファプールのストレージエンジンとしてのInnoDBを使用する - 。https://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html

3)それが可能な場合は、クエリの使用限界からすべてのレコードを取得し、データを狭くするOFFSET(限度とLaravelまたは唯一のpaginateでメソッドをスキップしていないが)

4)ユーザー・データを必要としない場合は使用しないでください(各トランザクションおよび順序は常にユーザーを持っている場合)INNERはFPMとPHP> = 7.0を使用して、それがするopcache)正しく

6をお使いのサーバーを設定するには、ABhttp://httpd.apache.org/docs/2.2/programs/ab.htmlを使用して)テスト要求usersテーブルに

5を登録しよう要求の上限を増やす

7)キャッシュAPI https://laravel.com/docs/5.5/cache(更新キャッシュを使用して、クエリのストア結果をデータが変更された場合)

8)https://github.com/barryvdh/laravel-debugbar

+0

どのような場合でも 'procedure' mysqlヘルプができますか? –

+0

私は疑問に思っています、手順は単にクエリを簡素化しましょう – marcus

+0

mysqlの 'OPTIMIZE TABLE'のこのクエリが良いか、物理データのみを再編成するだけです。https://dev.mysql.com/doc/refman/5.7/en/optimize -table.html –

0

あなたは、多くの関係に多くの人にとって適切な指導のためのリンク

下に通過Laravelの関係を使用する必要があります。

https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

あなたの条件での使用に適切な1によります。それがあなたを助けることを願っています。

リレーションシップを設定すると、単一のオブジェクトを呼び出すテーブルのデータにアクセスできます。

+0

私はこれらのテーブルに関係がないかどうかを質問したいと思います。データを取得したい(各テーブルに多数のレコードがあり、クエリを行うテーブルがたくさんあります)、またはウェブサイトでデータを取得するためにajaxを使用する必要があります –

+1

Laravelには、あなたが探しているような機能はありません。 –

1

この状況では、Cacheをよく使用し、毎回データベースにヒットする必要はありません。

処理時間を短縮でき、パフォーマンスが向上します。