2011-06-03 6 views
0

私はショップオーダーのレポートを作成しています。 SQLクエリは期待通りに機能します。レポート結果 - SQLを改善できるか?

各ショップの注文数、注文総額、手数料、および未払いの項目を計算します。

顧客はオンラインからのカードで支払った場合は配達時に現金で支払った顧客は、それはOutstandingCommフィールド を示している場合、それはoutstanding_shopフィールドを表示

SELECT T.ShopID, T.company, O.order_id, count(*) as NumOfOrders, 
     sum(O.shop_remaining) as ShopEarnings, 
     sum(O.comm_grandtotal) as OurComm, 
     SUM(CASE WHEN payment_method = 'PayCash' AND status = 1 THEN O.comm_grandtotal ELSE 0 END) as OutstandingComm, 
     SUM(CASE WHEN payment_method = 'PayCard' AND status = 1 THEN O.shop_remaining ELSE 0 END) as outstanding_shop 
FROM Shops as T 
     JOIN orders O ON O.ShopID = T.ShopID 
Group by ShopID 

このSQLクエリは改善かであることができができます代わりに良い方法がありますか?

+0

にインデックスを持つ必要があります。あなたは何を期待していますか? – YXD

+0

私に良く見えます...もし何かを考えなければならないのなら、それはちょうどスタイルになります。最初の2つの「合計」関数は小文字で、次の2つは大文字で表示されます。また、 'SELECT'と 'FROM'は大文字で表示されますが、 'Group by'は表示されません。 –

+2

StackOverflowは主に実際の問題を解決するためのものです。見直しのために[codereview.stackexchange.com](http://codereview.stackexchange.com/)に投稿してみてください。 –

答えて

1

いくつかのこと:ここで
は、各変更の影響を、あなたがそれのように感じる場合は、それらを試し、検討したが、時間を確認するためにいくつかあり、それが動作しない場合がありますか、それは物事が遅くなるかもしれません。

  1. case whenは、文字列(PayCash/PayCard)に見えます。そのフィールドに数値を設定し、そのフィールドにインデックスを付けて数値をチェックすると、より速く実行される可能性があります。カーディナリティーが低いため、索引は使用されない可能性があります。
  2. InnoDBを使用している場合は、stores.companyにインデックスを挿入してください。この方法でMySQLはstores.companyのカバーインデックスを使用してcompanynameを取得することができ、テーブルショップでテーブル全体を読み取る必要はありません。
  3. テーブルをフィールドstatusでパーティション分割することを検討してください。ステータスはカーディナリティが低いため、インデックスはおそらく使用されませんが、パーティション化すると、MySQLはテーブルのstatus = 1バージョンからのみ読み込みます。,status=0のフィールドがある場合にのみ行います。
  4. 現在すべての取引を選択していますが、これはおそらくありえません。年または月ごとにテーブルを分割し、現在の年または月のみを選択します。
  5. shops.shopidには、すでにプライマリオートインクリメントキーがあります。
  6. はまた、そこに普通の何も表示できませんorders.shopid
+0

提案/アドバイスありがとう。それは役に立ちました。私は数字(3)を理解していない、あなたが意味することを明確にして、例を含めることができますか?ありがとう! – user622378

+0

また、私のテーブルはすべてMyISAMです。 InnoDBへの変更点はありますか? – user622378

+0

InnoDBはカバリングインデックスを使用できます。http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ – Johan

1

あなたのSQLは既によく見えます。あなたはすでにあなたのデザインのためにできる限りのことをしています。

0

マックスウェルハウスのコーヒーのような音...最後のドロップに!...しかし、WHERE句を考慮すると、将来的にデータが拡大する可能性があります。現在のJOINでANDします。私は考えることができる

+0

私が従うかどうかわかりません... OPの要件は何らかのフィルタリングを要求していますか?そうでない場合は、なぜWHERE句を追加することを検討しますか?この句には何が含まれていますか? –

+0

おい...私はOPの要件の文書を見たことがない...彼/彼女はそれが改善できるかどうか尋ねた...私は[提案]を提供していた...私は確信している将来は。おそらく、ストアが追加された日付の範囲、おそらくトランザクションの日付、もし彼/彼女がdbを持っていれば。 –