0

私のオフィスでは、すべてのデータを固定幅レコードのプレーンテキスト ファイル (拡張子 TXT) に格納する従来の会計システムを使用しています。各データ ファイルには、FILESALE.TXT などの名前が付けられます。私の目標は、このデータを MySQL サーバーに持ち込んで、レガシー ソフトウェアと連携できない他の多くのプログラムが読み取り専用で使用できるようにすることです。各ファイルは基本的に 1 つのテーブルです。

アクセスする必要があるファイルは合計で約 20 個あり、合計データは約 1 GB です。各行の幅は 350 ~ 400 文字で、列数は 30 ~ 40 です。データを取り込んだ後、1​​00MB をはるかに超える MySQL テーブルはありません。

従来の会計システムは、テキスト ファイル内の任意の行を変更し、古い行を削除し (削除されたレコード マーカー -- 0x7F を持っています)、新しい行をいつでも追加できます。

ここ数年、私は 5 分ごとに次のような cron ジョブを実行しています。

  1. 各データ ファイルの最終変更時刻を確認します。
  2. ファイルが変更されていない場合は、スキップしてください。さもないと:
  3. データ ファイルを解析し、問題をすべてクリーンアップし (非常に単純なチェックのみ)、必要な列のタブ区切りファイルを吐き出します (一部の列は無視します)。
  4. テーブルを TRUNCATE し、次のように新しいデータを MySQL サーバーにインポートします。

    START TRANSACTION;
    TRUNCATE legacy_sales;
    LOAD DATA INFILE '/tmp/filesale.data' INTO TABLE legacy_sales;
    COMMIT;
    

cron スクリプトは、各ファイルのチェックと解析を並行して実行するため、更新プロセス全体にそれほど時間はかかりません。最大のテーブル (頻繁に変更されない) の更新には約 30 秒かかりますが、ほとんどのテーブルは 5 秒未満で済みます。

これは問題なく動作していますが、いくつかの問題があります。データベースのキャッシングに問題があると思うので、テーブルを TRUNCATE して LOAD するたびに、最初は MySQL データベースを使用する他のプログラムが遅くなります。さらに、更新を並行して実行するように切り替えたとき、データベースは数秒間、わずかに一貫性のない状態になる可能性があります。

このプロセス全体は恐ろしく非効率的です。この問題にアプローチするより良い方法はありますか? 調査する価値のある最適化や手順について何か考えはありますか? 同様の状況に直面した人からの巧妙なトリックはありますか?

ありがとう!

4

3 に答える 3

2

いくつかのアイデア:

  • テキスト ファイルの行に変更のタイムスタンプがある場合、スクリプトを更新していつ実行されたかを追跡し、最後の実行以降に変更されたレコードのみを処理できます。

  • テキスト ファイルの行に主キーとして機能するフィールドがある場合、その ID でキー付けされた各行のフィンガープリント キャッシュを維持できます。これを使用して、行がいつ変更されたかを検出し、変更されていない行をスキップします。つまり、テキスト ファイルを読み取るループで、行全体の SHA1 (または何でも) ハッシュを計算し、それをキャッシュのハッシュと比較します。一致する場合、行は変更されていないため、スキップします。それ以外の場合は、MySQL レコードを更新/挿入し、新しいハッシュ値をキャッシュに保存します。キャッシュは、GDBM ファイル、memcached サーバー、MySQL テーブルの指紋フィールドなど、何でもかまいません。これにより、変更されていない行が MySQL にそのまま残ります (つまり、キャッシュされたままになります)。

  • 不整合を避けるために、トランザクション内で更新を実行します。

于 2013-03-05T22:01:39.477 に答える
0

アレックスのヒントに同意します。可能であれば、変更されたフィールドのみを更新し、トランザクションと複数の挿入をグループ化して一括更新します。トランザクションの追加の利点は更新の高速化です

ダウンタイムが心配な場合は、テーブルを切り詰めるのではなく、新しいテーブルに挿入してください。名前を変更します。

パフォーマンスを向上させるために、フィールドに適切なインデックスが作成されていることを確認してください。

_ mysql のdelayed_inserts などのデータベース固有のパフォーマンスのヒントを参照してください _ パフォーマンスを向上させます _ キャッシュを最適化できます _ 一意の行がなくても、行を md5 できる場合があります (またはできない場合があります)。

于 2013-03-06T03:49:59.770 に答える
0

2 つのことが頭に浮かびます。詳しくは説明しませんが、お気軽に質問してください。

  1. ファイルの処理をアプリケーション サーバーにオフロードしてから、mySQL テーブルに入力するだけのサービスです。テーブル全体を切り捨てるのではなく、重複レコードをチェックすることでインテリジェンスを構築することもできます。

  2. 処理を別の mysql サーバーにオフロードし、複製/転送します。

于 2013-03-05T21:47:51.863 に答える