最近の質問Select information from last item and join to total amountに従って、テーブルの生成中にメモリの問題が発生しています
私は2つのテーブルを持っていてsales1
、sales2
このようにしています:
ID | 日付 | 顧客 | セール
このテーブル定義では:
CREATE TABLE sales (
id int auto_increment primary key,
dates date,
customer int,
sale int
);
sales1
とsales2
同じ定義をsales2
持ちますがsale=-1
、すべてのフィールドにあります。顧客は、いずれのテーブルにも、1 つまたは両方のテーブルにも存在できます。両方のテーブルには、約 300.000 レコードと、ここに示されているよりもはるかに多くのフィールド (約 50 フィールド) があります。それらは InnoDB です。
顧客ごとに選択したい:
- 購入数
- 前回の購入額
- 正の値の場合の合計購入金額
私が使用しているクエリは次のとおりです。
SELECT a.customer, count(a.sale), max_sale
FROM sales a
INNER JOIN (SELECT customer, sale max_sale
from sales x where dates = (select max(dates)
from sales y
where x.customer = y.customer
and y.sale > 0
)
)b
ON a.customer = b.customer
GROUP BY a.customer, max_sale;
問題は:
特定の計算に必要な結果を、日付ごとに分けて取得する必要があります。2012 年の情報、2013 年の情報だけでなく、すべての年をまとめた情報も取得する必要があります。
私がちょうど 1 年間やると、すべての情報を保存するのに約 2 ~ 3 分かかります。
しかし、すべての年から情報を収集しようとすると、データベースがクラッシュし、次のようなメッセージが表示されます。
InternalError: (InternalError) (1205, u'Lock wait timeout exceeded; try restarting transaction')
このような巨大なテーブルを結合するのは、データベースにとって負担が大きすぎるようです。クエリをexplain
実行すると、ほぼすべての時間の割合がcreating tmp table
.
収集したデータを 4 分の 1 に分割することを考えました。3 か月ごとに結果を取得し、それを結合して並べ替えます。しかし、この最後の結合と並べ替えは、データベースにとってはやり過ぎになると思います。
では、テーブル構造を変更できない限り、これらのクエリを最適化するために専門家は何を推奨しますか?