2017-08-02 18 views
1

私の質問に費やしてくれてありがとうと申し訳ありませんが、すでに何か似たような質問があった場合は、ありがとう。PHP - MySQL 1.000.000レコードのクエリの最適化

db scheme

私はDBのための唯一のSELECT権限を持っている:

私はDBの次の図を持っています。 私のクエリは、現在の設定で2-3秒から10秒間実行される傾向があります。 私はプロビジョニング現在の構造を最大限に最適化することが求められていますし、私のSQLは次のようになります。

SELECT items.`type` AS type, 
    DATE(orders.date) AS date, 
    sum(items.price * orders.quantity * clients.discount_percent/100) AS total 
    FROM orders 
INNER JOIN items ON orders.item = items.id 
INNER JOIN clients ON orders.`client` = clients.id 
GROUP BY DATE(orders.date), items.`type` 

I(Iは1ヶ月間隔であるすべての注文内の各製品の総収入を取得する必要があります) PHP側のデータを扱うSQLを変更することで結果をまとめることを考えていましたが、効果的かどうかは分かりませんでした。

これが最適化できる場合、フォームを聞くのが大好きです:)。

KR、 Dippy

P.S. EXPLAIN

+0

日付の列(アイテム、クライアント)のインデックスはありますか? – Maadinsh

+1

これらのテーブルにはどのようなインデックスがありますか? EXPLAINはこのクエリに対して何を表示しますか? –

+1

まず、説明計画を入手してください。しかし、インデックスを作成することが許可されていない場合、それは楽しいことになるでしょう。 –

答えて

0

orders.itemorders.clientがインデックス化されているフィールド:結果を説明 ? Phpmyadminでテーブルを作成する場合は、フィールドをインデックスとリレーションシップとして指定する必要があります。JOINを使用してそのようなクエリを作成すると、クエリは検索用に最適化されます。

ALTERテーブルを作成し、そのフィールドをINDEXのように設定することはできますが、それらは同じタイプである必要があります。例PRIMARY KEYFOREIGN KEYINT UNSIGNEDである必要があります。

この回答を参考にしてください。

0

は、一般的に言えば、あなたのパフォーマンスの問題が

「注文」を超える全表スキャンによって原因であることは、小さなデータセット(〜10メガバイト)のためにそれほど大きな実行時間奇妙です。私のサーバー上で同様のクエリを実行するには、1秒以上かかります。

データサイズを小さくしてデータタイプを最適化してください。 (インデックスの場合はintを使用する必要があります)。

Orders.Dataにインデックスがあるかどうかを確認します。

インデックスのパフォーマンスを向上させるために、Orders.DataがDate型であることを確認してください。

すべての場合、いくつかの集計関数(グループと合計)を使用していますが、これらのタイプの関数は非常に高価です。サーバーが最初にすべてのデータを含む大きなテーブルを生成し、集計関数を実行したからです。

サーバーの構成(ワークロード、RAMまたは...など)によるパフォーマンスの問題がある場合は、結果をキャッシュしてすべての結果を再計算しないようにできます。