2011-04-21 11 views
1

現在、私はちょうどredicolusであるデータセットから作業しています。韻や理由がない複数のベンダのフラットファイル。約200の列に座っています。私は別のテーブルに引き出したそれらの200の間に共通する15があります。Mysqlキャスティングパフォーマンスベンチマーク質問/データアーキテクチャ

他の185列からは、varchar、intのdatetimeと複数の文字列値が混在しています。

今、私はこれらの他の185個のカラムをどのように保存するのが最適かを判断しようとしています。平らなテーブルのように、現在はそれほど大規模ではないと証明しています。私は2つのソリューションのセットアップを持っていますが、どれが良いか分かりません。この方法を使用しているようだが

一つは、(画像に見られる)Image architecture

を別のテーブル内の列のそれぞれのメタデータを記憶しています。道を歩いていると、ここにあるアイテムについて質問する必要があります。しかし

select * from foo where cast(col_to_query) as int < 5 

私は」:

私は、ID、値、データ型を持つテーブルにすべての列を投げていると考えられてきた他の方法、やってクエリがデータ型、すなわちに値をキャストするときよりもそのようなことをするときのパフォーマンスはどういうものか分かりません。

質問:

これらの2つの方法で、より良いパフォーマンスが賢明で、もう1つはあなたが推薦するでしょう(または私はそれを聞くのが大好きだより良いオプションがある場合)。

+0

にfile1_data に参加しますか – squawknull

+0

"しかし、そのようなことをするときのパフォーマンスはどういうものか分かりません。" - - どういたしまして。フィールドに関数を適用したので、fullscanを取得します。 – zerkms

答えて

3

ありがとう最初のアプローチは、単一のテーブルよりもさらに悪いスケールします、と起動するように照会する非常に困難になります。

最初のアプローチとして、すべての列を含む単一の表を使用することをお勧めします。あなたはそれがうまくいかないと言った。それはどういう意味ですか?どのようにスケーリングが不十分ですか?クエリは返されるまでに長い時間がかかりますか?クエリのためにテーブルのインデックスを正しく作成しましたか?大量のデータを返す場合を除き、列の数はクエリが大幅に戻る時間に影響を与えないことがよくあります。そうであれば、mysqlとクライアントの間でデータを転送するのにすべての時間が費やされていれば、クエリの応答時間にほとんど影響しません。このような場合は、気にするカラムだけを選択してください。 「選択*」しないでください。

テーブル継承戦略を使用することもできます。この場合、15の一般的な属性を格納する1つの親テーブルと、レコードのタイプを識別する「タイプ」(それが元のファイルに基づいているか、ソースと呼ぶことができます)があります。次に、それぞれの特定のファイルについてのみカスタム列を使用して、各ファイルごとに1〜0-1のマッピングを持つ拡張テーブルを作成します。これは、ジョインを行う必要があるため、1つの大きなテーブルと同じように機能しませんが、多くの場合NULLである1つのテーブルの列を一杯にする必要性を減らすのに役立ちます。

これは次のようになります:

create table master (
    master_id int not null auto_increment primary key, 
    type int, 
    <field1> int, 
    <field2> varchar(20), 
    ... 
); 

create table file1_data (
    master_id int not null primary key, 
    type int, 
    <field16> int, 
    <field17> varchar(20), 
    ... 
); 

クエリ、それを次のように:

選択し、...内側のマスター から は、私たちがどのように多くの行を話している?file1_data.master_id = master.master_id どこ...

+0

200カラム;大量のデータが含まれています。ほとんどの列はvarchar(255)またはテキストフィールドです。最初にデータを挿入するのに時間がかかります。拡張テーブルについてもう少し説明できますか?私はそれを完全に理解していません。 – Petrogad

+1

あなたはおそらくそれを回避するつもりはありません。 1つの表または束にデータを格納している場合でも、その列が多数ある場合は、挿入がやや遅くなります。 LOAD DATA INFILEなどのバルク・インサート・アプローチを使用してデータをロードすることを検討してください。それはそれをスピードアップするかもしれない。 http://dev.mysql.com/doc/refman/5.5/en/load-data.html – squawknull

+0

ファイルはベンダーによって異なりますか? 185の列は、すべてのベンダーのファイル全体の列の合計数ですか、またはすべてのベンダーが同じファイルを送信しますか? – squawknull