2011-02-07 1 views
0

私は2億を少し上回るレコードを含む注文テーブルを持っています。統計については、私は3つの異なるカウントを取得する必要があります。 1つは、特定の日付範囲内に置かれた注文の数、特定の状態から発注された注文数、そして特定の日付範囲内の特定の状態からの注文数です。最初の2つのクエリは平均して10〜20百万レコードを返し、通常は5秒以下かかる。しかし、3時間以内に結果を返すための3番目のクエリを取得できませんでした。実際のクエリは次のとおりです。MySQL 2つのパラメータの数を取得する

SELECT COUNT(*) 
    FROM orders 
WHERE order_date BETWEEN date1 AND date2; 

要約すると、クエリには4秒かかります。

SELECT COUNT(*) 
    FROM orders 
LEFT JOIN customers ON orders.customer_id = customers.customer_id 
    WHERE customer.state = 'PA'; 

上記に要約すると15milのレコードがあり、クエリには5秒かかります。

(SELECT COUNT(*) 
    FROM orders 
    WHERE order_date BETWEEN date1 AND date2) 
UNION 
(SELECT COUNT(*) 
    FROM orders 
LEFT JOIN customers ON orders.customer_id=customers.customer_id 
    WHERE customer.state = 'PA'); 

上記に要約すると4500レコードがあり、クエリには2時間かかります。

もう少し妥当な時間内にカウントを得ることができる3番目のクエリには別の方法がありますか?好ましくは1分未満ですか?

+0

あなたがテーブル定義を投稿してくださいすることができEXPLAINとしてaswell、(2列の代わりの2行はように、第2の1はそれを返します)出力? –

+0

UNIONは重複を削除することに気付きます。両方が25の場合は、1つの行しか表示されません。 –

+0

時間を忘れて、3番目のクエリが正しい結果を返していません。 –

答えて

3

一緒にクエリに参加してください。また、お客様の状態でフィルタリングしているため、LEFT JOININNER JOINに変更してください。

0

3つのクエリが必要です。

SELECT COUNT(*) 
    FROM orders 
WHERE order_date BETWEEN date1 AND date2; 

SELECT COUNT(*) 
     FROM orders 
INNER JOIN customers ON orders.customer_id = customers.customer_id 
    WHERE customer.state = 'PA'; 

SELECT COUNT(*) 
     FROM orders 
INNER JOIN customers ON orders.customer_id = customers.customer_id 
    WHERE customer.state = 'PA' 
     AND order_date BETWEEN date1 AND date2; 

第二1は、JOINをLEFTにすることができますが、WHERE句を使用して、顧客にフィルタリングされているので、LEFTが参加するすべてのレコードを保持する理由はありません。

1つのクエリでクエリ1とクエリ2からのカウントを返そうとする3番目のクエリは、ゆっくりと動作していますmost likely MySQLはUNIONを参照していました。以下のいずれかの作業をする必要があり、より良い

SELECT "Date", COUNT(*) 
    FROM orders 
    WHERE order_date BETWEEN date1 AND date2 
UNION ALL 
SELECT "Customer", COUNT(*) 
    FROM orders 
LEFT JOIN customers ON orders.customer_id=customers.customer_id 
    WHERE customer.state = 'PA'; 

または

SELECT 
(SELECT COUNT(*) 
    FROM orders 
    WHERE order_date BETWEEN date1 AND date2) DateCount, 
(SELECT COUNT(*) 
    FROM orders 
LEFT JOIN customers ON orders.customer_id=customers.customer_id 
    WHERE customer.state = 'PA') CustomerCount 

関連する問題