2017-06-18 6 views
0

私はstatsテーブルを持っています。毎日のトラフィックが記録され、毎日レコードが約500,000レコード挿入されています。この表の 構造のみMySQLの複数のinsert from single select

私は他のテーブルで、このテーブルのデータとストア結果に分析を実行する必要がある。この表は、これまでサイズが増加していると私は書き込み操作のためにそれを維持したい

id | ip | url | date | country | referrer | type | rate | category |.... 

のようなものです報告のため。私は次のようにデータを保存するために計画しています

..

stats_by_dateは、日付ごとにグループ化され、毎日の統計を持っています。

stats_by_countryは、国ごとにグループ化された毎日の統計情報を持ちます。

stats_by_typeは、種類ごとにグループ化された毎日の統計情報を持ちます。

stats_by_categoryは、カテゴリ別にグループ化され、毎日の統計を持っています。

この方法の代わりに50万行のみ1行は250行が毎日のために存在しますcountryテーブルを除いて毎日のために存在します。

30分ごとにメインテーブルからこれらのテーブルにデータを挿入する必要があります。私はこのように

INSERT INTO `stats_by_date` (id, ip, date, rate, type) 
(
SELECT id, COUNT(ip), date, rate, type FROM `stats` 
WHERE date=today 
GROUP BY date 
); 

INSERT INTO `stats_by_type` (id, ip, date, rate, type) 
(
SELECT id, COUNT(ip), date, rate, type FROM `stats` 
WHERE date=today 
GROUP BY type 
); 

ような複数のクエリでデータを挿入することができる知っている はGROUP BYに基づいて、メインテーブルから同じデータを読み取り、挿入されます少なくとも4つのINSERTクエリが存在することになります。

メインテーブルから一度だけ読み込み、他のすべてのテーブルに挿入したいとします。これを達成するために、私の知る限り 私はメインテーブルからデータを格納し、その後、このTEMPORARY TABLEから、私は複数のINSERTを行うことができます持っているTEMPORARY TABLEを作成する必要があります知っています。私が知りたい

がこれを行うには、他の効率的な方法があり、それが単一SELECT、いくつかの方法で行うことができますか?

ご覧ください。

答えて

0

毎日500,000行が相当量のデータです。このプロセスは、通常、プライマリ・テーブルのトリガを使用して処理されます。トリガは新しいデータの挿入を行います。

dateの列には、一括アップロードプロセスがあることが示されています。 これがある場合は、アップロードを実行した後に行をサマリーテーブルに追加できます。これは、トリガーを使いこなすよりもはるかに簡単です。トリガーは、サマリー・テーブルのアップデートを数多く実行します。

+0

統計表内のデータ(プライマリー)は、ウェブページへの毎日の訪問で、私は、バッチアップロードプロセスを持っていないが、私は、サマリー表にデータを挿入するために、時間ベースのトリガーを使用することになります。 –

+0

@TallboY。 。 。時間ベースの*イベント*は、各インサートのトリガーよりもはるかに良いアイデアです。 –

+0

このように 'INSERT 'を単なる' SELECT'でやる方法はありません。出来ますか? –

関連する問題