私のオフィスでは、すべてのデータを固定幅レコードのプレーンテキスト ファイル (拡張子 TXT) に格納する従来の会計システムを使用しています。各データ ファイルには、FILESALE.TXT などの名前が付けられます。私の目標は、このデータを MySQL サーバーに持ち込んで、レガシー ソフトウェアと連携できない他の多くのプログラムが読み取り専用で使用できるようにすることです。各ファイルは基本的に 1 つのテーブルです。
アクセスする必要があるファイルは合計で約 20 個あり、合計データは約 1 GB です。各行の幅は 350 ~ 400 文字で、列数は 30 ~ 40 です。データを取り込んだ後、100MB をはるかに超える MySQL テーブルはありません。
従来の会計システムは、テキスト ファイル内の任意の行を変更し、古い行を削除し (削除されたレコード マーカー -- 0x7F を持っています)、新しい行をいつでも追加できます。
ここ数年、私は 5 分ごとに次のような cron ジョブを実行しています。
- 各データ ファイルの最終変更時刻を確認します。
- ファイルが変更されていない場合は、スキップしてください。さもないと:
- データ ファイルを解析し、問題をすべてクリーンアップし (非常に単純なチェックのみ)、必要な列のタブ区切りファイルを吐き出します (一部の列は無視します)。
テーブルを TRUNCATE し、次のように新しいデータを MySQL サーバーにインポートします。
START TRANSACTION; TRUNCATE legacy_sales; LOAD DATA INFILE '/tmp/filesale.data' INTO TABLE legacy_sales; COMMIT;
cron スクリプトは、各ファイルのチェックと解析を並行して実行するため、更新プロセス全体にそれほど時間はかかりません。最大のテーブル (頻繁に変更されない) の更新には約 30 秒かかりますが、ほとんどのテーブルは 5 秒未満で済みます。
これは問題なく動作していますが、いくつかの問題があります。データベースのキャッシングに問題があると思うので、テーブルを TRUNCATE して LOAD するたびに、最初は MySQL データベースを使用する他のプログラムが遅くなります。さらに、更新を並行して実行するように切り替えたとき、データベースは数秒間、わずかに一貫性のない状態になる可能性があります。
このプロセス全体は恐ろしく非効率的です。この問題にアプローチするより良い方法はありますか? 調査する価値のある最適化や手順について何か考えはありますか? 同様の状況に直面した人からの巧妙なトリックはありますか?
ありがとう!