perl 経由で更新しようとしている大規模なデータベースがあります。追加する情報は、私が管理していない csv ファイルから取得されます (ただし、これは信頼できるものであり、当社の別の部門からのものです)。ファイル内の各レコードに対して、それを追加する (存在しない場合) か、何もしない (存在する場合) 必要があります。レコードの追加は通常の で構成されますINSERT INTO
が、特定のエントリに対して実行する前に、特定の をUPDATE
実行する必要があります。
具体的に言うと、ファイルには 10,000 のエントリがあり、そのうちの 90% は既にデータベースにあるとします。レコードをインポートする最も効率的な方法は何ですか? いくつかの明白なアプローチを見ることができます:
- このタイプのすべてのレコードをデータベースから取得し、ファイルの各エントリのメンバーシップを確認します。欠点: 大量のデータ転送が発生し、サーバーがタイムアウトする可能性があります。
- ファイルからエントリを読み込み、クエリを使用してそれらのレコードのみを
RLIKE 'foo|bar|baz|...'
クエリします (またはstuff = 'foo' || stuff = 'bar' || ...
クエリですが、それはさらに悪いようです)。欠点: 巨大なクエリで、おそらくサーバーを停止させるのに十分です。 - ファイルを読み込み、エントリごとにクエリを送信し、必要に応じて追加します。欠点: 何万ものクエリがあり、非常に遅い。
要件は別としてUPDATE
、これはおそらく標準的な解決策があるかなり標準的な問題のようです。ある場合は、auto_increment
主キーのテストを適切に使用することで、おそらく私のケースに適応させることができます。