2011-07-19 13 views
4

私はいくつかのデータベースから大量のデータを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; 

答えて

12

さまざまなテキスト/ BLOB型は、PHPでのストレージ要件にすべて同一であり、まったく同じように実行します。 blobフィールドはそうではありません。言い換えれば、blobはバイナリを格納しているときに、入ってきたものと全く同じになる必要があります。テキストフィールドは、ある文字セットから別の文字セットに変換できるテキストデータを格納するためのものです。

+0

さて、挿入速度を改善する他の方法はありますか? – pthurmond

+0

あなたが書いているデータの量を減らさない限り、実際はそうではありません。外部にデータを格納し、ファイルパス/メタデータのみをDBに格納する方が効率的です。 –

+0

本当に???私はそれをファイルに保存する方が高価になると思います。特に、バッチでデータを移行する必要があるため、インポートするデータを操作してからDrupalに挿入する必要があります。私が見ている問題は、システムのメモリが不足していることです。それが起こらないと、無作為のDrupal関数がタイムアウトします。これまでのところ、私の機能はどれもタイムアウトしていません。しかし、データベースを使用することによって、私はそれをDBに入れることによっていくつかのリソース使用を排除していることがわかります。 – pthurmond

関連する問題