私はいくつかのデータベースから大量のデータを1つに移行する過程にあります。中間段階として、各データ型とソースdbのファイルにデータをコピーし、それを新しいデータベースの大きなテーブルにコピーします。MySQLは、より効率的な長いテキスト、テキスト、またはblobですか?挿入効率を改善する
構造は、migrate_dataという新しいテーブルでは単純です。これは、id(主キー)、type_id(データ型セット内でインクリメント)、data(移行しているデータを保持するシリアル化されたPHPオブジェクトを含むフィールド)、source_db(明らかにソースデータベースを参照)、data_type (私たちが見ているデータの種類を特定する)。
データフィールド以外のすべてのキーとキーの組み合わせを作成しました。現在、私はlongtext列として設定されたデータフィールドを持っています。ユーザーの挿入には、平均で約4.8秒かかります。テーブルのDELAY_KEY_WRITE = 1を使用して4.3秒までトリミングすることができました。
私が知りたいことは、パフォーマンスをさらに向上させる方法があるかどうかということです。おそらく、別のデータ列型に変更することによって可能です。だからこそ、私は長いテキスト対テキスト対ブロブについて尋ねる。このようなインサートの方が効率的ですか?
あなたが答える前に、もう少し詳しくお話します。私はすべてのデータをオブジェクトを受け取る挿入関数に送り、serializeでそれを実行してから、データ挿入を実行します。また、Drupal 6(およびそのdb_query関数)を使用して実行されています。
効率が向上したらすばらしいと思います。
現在のテーブル構造:テキストフィールドは、文字セット変換の対象となっている以外
CREATE TABLE IF NOT EXISTS `migrate_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_id` int(10) unsigned NOT NULL DEFAULT '0',
`data` longtext NOT NULL,
`source_db` varchar(128) NOT NULL DEFAULT '',
`data_type` varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `migrated_data_source` (`source_db`),
KEY `migrated_data_type_id` (`type_id`),
KEY `migrated_data_data_type` (`data_type`),
KEY `migrated_data_id__source` (`id`,`source_db`),
KEY `migrated_data_type_id__source` (`type_id`,`source_db`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 DELAY_KEY_WRITE=1;
さて、挿入速度を改善する他の方法はありますか? – pthurmond
あなたが書いているデータの量を減らさない限り、実際はそうではありません。外部にデータを格納し、ファイルパス/メタデータのみをDBに格納する方が効率的です。 –
本当に???私はそれをファイルに保存する方が高価になると思います。特に、バッチでデータを移行する必要があるため、インポートするデータを操作してからDrupalに挿入する必要があります。私が見ている問題は、システムのメモリが不足していることです。それが起こらないと、無作為のDrupal関数がタイムアウトします。これまでのところ、私の機能はどれもタイムアウトしていません。しかし、データベースを使用することによって、私はそれをDBに入れることによっていくつかのリソース使用を排除していることがわかります。 – pthurmond