2016-05-20 11 views
1

私は最近、同じ問題に沸きますが、別のデータベーステクノロジ(ROW_NUMBER()の使用に関連する解決策を意味する)を使用して、ここに適用されます)。COUNT、MIN、MAXを使用するクエリの効率を向上

「Customers」というMySQLデータベースにテーブルがあるとします。私はまた、 "オーダー"と呼ばれるテーブルを持っています。それぞれのテーブルには "CustomerID"が入っています。私がしたいことは、彼らが行った注文の数と最初と最後の "注文"が発生したときのように、各 "顧客"の要約を生成することです。

次のように私はこのために使用されているクエリは次のとおりです。

SELECT 
    Customer.CustomerID, 
    Customer.Name, 
    COUNT(Orders.OrderID) AS Orders, 
    MIN(Order.Timestamp) AS OldestOrder, 
    MAX(Orders.Timestamp) AS NewestOrder 
FROM Orders 
INNER JOIN Customerts ON Orders.OrderID = Customers.CustomerID 
GROUP BY Orders.CustomerID 

このクエリは、私が欲しい、まさに取得しますが、数十万のオーダーを含むデータベース上で、それを実行するために2〜3秒かかることがあります。

"受注"テーブルに "得意先コード"と "タイムスタンプ"を含むインデックスを追加すると、この時間は約1秒以下になりますが、依然として受け入れられません。このクエリが実行される顧客のリストは通常​​比較的小さいので、データを取得するために個々のクエリを実行する各顧客のループがより迅速なオプションですが、これははるかに面倒です。

これ以上のインデックスの機会はありませんか、このクエリはまったく異なる方法で機能する必要がありますか?私の処分でMSSQLのROW_NUMBER()機能を使用した場合、このクエリは信じられないほど迅速に機能します...

ありがとうございます!

EDIT#1:EXPLAIN SELECTショー:

id select_type table  type  possible_keys key   key_len ref     rows Extra 
1 SIMPLE  Customers ALL  PRIMARY  NULL   NULL  NULL     10 Using temporary; Using filesort 
1 SIMPLE  Orders  ref  CustomerID_2 CustomerID_2 4  Customers.CustomerID 4038 Using where 
+4

'group by'節に' Customer.Name'を追加し、実行計画を得るために 'explain select ...'を使用してください –

+0

最低限、クエリのパフォーマンスに関する質問は、常に関連するすべてのテーブルとEXPLAIN。また、MSSQLのROW_NUMBERオプションがどのようなメリットがあるか分かりませんので、2つの異なることを求めているように見えます。 – Strawberry

+0

@juergendできるだけ説明を加えました。 –

答えて

0

それが答えを見えるが、右私の目の前にありました! "CustomerID"と "Timestamp"を含むOPで述べたインデックスを "OrderID"を含むものに置き換えると、クエリーが約0.07秒に短縮されました!これはJignesh Patelの答えに概説されているように、 "Customers"テーブルをフォーカルポイントとして使用することで、さらに約50%削減されました。

1
SELECT 
    Customers.CustomerID, 
    Customers.Name, 
    COUNT(Orders.OrderID) AS Orders, 
    MIN(Orders.Timestamp) AS OldestOrder, 
    MAX(Orders.Timestamp) AS NewestOrder 
FROM Customers 
INNER JOIN Orders ON Orders.CustomerID= Customers.CustomerID 
GROUP BY Customers.CustomerID 
+1

コードを投稿するだけで明確な説明を追加できますか? – ndsmyter

+0

これは問題の解決に興味深いです!実際には元のクエリよりも速いですが、残念ながらまだ遅すぎます。さらに、私はこの問題をより高いレベルで解決して、複数のクエリに広く適用できるようにしたいと考えています。この固有の解決策が本当にそれを行うのかどうかはわかりません。 –

+0

どのくらいの時間がかかりますか?両方のテーブルのCustomerIDフィールドにインデックスが作成されていますか? –

関連する問題