私は最近、同じ問題に沸きますが、別のデータベーステクノロジ(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
'group by'節に' Customer.Name'を追加し、実行計画を得るために 'explain select ...'を使用してください –
最低限、クエリのパフォーマンスに関する質問は、常に関連するすべてのテーブルとEXPLAIN。また、MSSQLのROW_NUMBERオプションがどのようなメリットがあるか分かりませんので、2つの異なることを求めているように見えます。 – Strawberry
@juergendできるだけ説明を加えました。 –