0

私は開発者であり、大量のレコードを持つテーブルを管理しているときに問題に直面しています。

5〜6列で約4,00,000〜5,00,000行のプライマリテーブル(テーブルA)にデータを入力するためにcronジョブを実行しています。その後、別のテーブルを作成すると、このテーブルのデータは時間の経過とともに増加し続けます。 。

表Aには生データが含まれており、出力表は表Bです。

私のcronスクリプトは、表Bのデータを切り捨ててから、selectクエリを使用してデータを挿入します

TRUNCATE TABLE_B; 

INSERT INTO TABLE_B (field1, field2) 
SELECT DISTINCT(t1.field2), t2.field2 
FROM TABLE_A AS t1 
INNER JOIN TABLE_A t2 ON t2.field1=t1.field1 
WHERE t1.field2 <> t2.field2 
GROUP BY t1.field2, t2.field2 
ORDER BY COUNT(t1.field2) DESC; 

上記の選択クエリは、約1,50,000〜2,00,000行を生成します

現在、テーブルBにデータを入力するのに時間がかかりすぎています。その間、アプリケーションがテーブルBにアクセスしようとすると、クエリの選択が失敗します。

次のクエリ結果の説明:

'1','PRIMARY','T1','ALL','field1_index',NULL,NULL,NULL,'431743','Using temporary;Using filesort' 
'1','PRIMARY','T2','ref','field1_index','field1_index','767','DBNAME.T1.field1','1','Using where' 

誰かがこのプロセスを改善するのを手伝ってくれますか、または上記のプロセスの代替案を教えてもらえますか?

ありがとう

スケツ

4

2 に答える 2

0

私の見解によると、解決策は次のようになります。

SELECT 
    DISTINCT(t1.field2), t2.field2 
    FROM 
        TABLE_A AS t1
    INNER JOIN 
        TABLE_A t2 ON 
        t2.field1=t1.field1 
    WHERE
        t1.field2 <> t2.field2 
    GROUP BY
        t1.field2, t2.field2 
    ORDER BY
       COUNT(t1.field2)
    DESC INTO OUTPUT "PATH-TO-FILE";

たとえば、「C:\ TEMP\DATA1.SQL」というファイル。このクエリで何が起こるかは、任意のテーブルに挿入するためのTAB区切り文字を使用して単純な新しいファイルが作成されます。次に、データをテーブルにインポートする方法を説明します。

LOAD DATA
    "PATH-TO-FILE"
INTO TABLE
     table_name

このクエリを使用すると、データが挿入されますが、一方で、データを挿入しているテーブルを使用できるようになります。

于 2011-05-09T13:15:33.163 に答える
0

プロセス全体をストアド プロシージャで実行する必要があります。

このような大きなテーブルを切り捨てないでください。次の手順に従います。

  1. TableB 構造体を TableB_Copy にコピーします。
  2. DROP TABLEB.
  3. TableB_Copy の名前を TableB に変更します
  4. TableB のインデックスを無効にする
  5. TableA のデータを TableB に挿入する
  6. TableB にインデックスを作成します。
于 2011-05-09T11:25:33.640 に答える