同様の状況がありました。スクリプトを改善するために多くの試みを行った結果、インポートを機能させるために別のアプローチが必要であり、10時間もかからないことにしました。
私たちが行ったのは、すべてのPHPコードをダンプし、代わりにmysqlimport
を使用することでした。 CSVファイルの内容をテーブルに直接ロードします。このテーブルには、必要なものがすべて含まれていますが、便利な形式ではありません(構造がない、一部のフィールドに処理が必要ななど)
ただし、すべてがデータベースにあるため、クエリで必要なすべてを実行できます。たとえば、インポートファイルに存在しなくなったすべてのデータを削除すると、DELETE FROM structured_table AS st LEFT JOIN unstructured_table AS ut ON st.someField = ut.someField WHERE ut.someField IS NULL;
、既存のレコードの更新は、UPDATE structured_table AS st INNER JOIN unstructured_table AS ut ON st.someField = ut.someField SET st.anotherField = CONCAT(ut.aField, ' ', ut.yetAnotherField);
。
明らかに、複雑なインポートスクリプトの場合、クエリはより複雑になり、より多くのクエリが必要になります。個々のフィールドで処理を行うために、いくつかのストアドプロシージャを投入する必要がある場合もあります。しかし、この種のアプローチをとることができれば、大量のデータを処理でき、非常にスケーラブルなプロセスになります。