1

初歩的な質問ですが教えていただけると助かります。私は次のSQLを適用しています:

INSERT INTO t03_hesid_history(uniqueID, hes_data_all_years.extract_hesid, FIELD1, FIELD2)  
SELECT uniqueID, hes_data_all_years.extract_hesid, FIELD1, FIELD2  
FROM hes_data_all_years  
INNER JOIN T02_hesid_grouped  
ON hes_data_all_years.extract_hesid = T02_hesid_grouped.extract_hesid;

hes_data_all_years テーブルには 1 億 8800 万のレコードがあり、T02_hesid_grouped テーブルには 80,000 のレコードがあります。T02_hesid_grouped テーブルには、インデックス付きの extract_hesid という単一の (一意の) フィールドがあります。hes_data_all_years には多くのフィールドがあり、結合されている extract_hesid フィールドに 1 つのインデックスがあります。

このクエリは、T02_hesid_grouped フィールドに一致する hes_data_all_years のすべてのレコードを抽出することを目的としています。出力で 1 ~ 2m のレコードが提供されることを期待しています。

クエリには約 4 時間かかります...

データセットのサイズによる時間の長さですか、それとも実行できる最適化はありますか? どうもありがとう!!

SELECT 部分の EXPLAIN 出力を以下に示します。

1   SIMPLE  T02_hesid_grouped   index   I_HESID I_HESID 43      79824   Using index
1   SIMPLE  hes_data_all_years  ref I_HESID I_HESID 43  hes.T02_hesid_grouped.extract_hesid 1   Using where
4

1 に答える 1

0

これは、結果セットの生成または宛先テーブルへの挿入に関するパフォーマンスの問題である可能性があります。

通常、挿入に使用されている結果セットに対しては実行しませんがSELECT *、宛先テーブルへのフィールドと同じ順序で選択する列に名前を付けます。結果セットには、という名前の2つの列があります extract_hesid。それがあなたが望むものである可能性は低いようです。

の行と一致しないhes_data_all_years.extract_hesidの行の値は何ですか?これらの値がNULLでない場合、処理は速くなります。hes_data_all_yearsT02_hesid_grouped

あなたのテーブル、特に宛先テーブルはMyISAMを使用していますか?InnoDBはトランザクション指向であり、数メガ行のINSERTを実行している間にロールバックデータを生成する必要があるため、処理が高速になります。

188メガローは小さくありません、そしてあなたの経過時間は完全に法外ではありません。それは長いですが、ばかげてそうではありません。MySQLサーバーに十分なRAMがあることを確認することをお勧めします。または、これが1年または1回限りの場合は、単に勝利を宣言して先に進むことをお勧めします。

于 2013-02-04T23:36:38.577 に答える