5


0

mysqlの空の列

私は現在、最適化キックをしています。

複数のテーブルを使用する傾向があるため、空の列はありません。

私の質問は、空の列は大したことですか? 私はスペースの話ではありません。 私はインデックス作成、データ取得などの速度に言及しています…​

私の賭けの例は、単純な顧客テーブルがあり、一部の列が常に入力されていない場合です。 メール、dob、ssn、picなど。 ほとんどの場合、彼らは記入されていません。

そのため、補助データのみを格納する新しいテーブルを作成します。 しかし、これらの列を他の顧客情報と同じテーブルに入れると、本当に違いが出るでしょうか?

これを行うと、空の列を持つ多くのレコードが存在します。 これにより、レコード数が膨大な場合にこれがパフォーマンスにどの程度影響するのか疑問に思います。

3 Answer


1


それらを可変長フィールド(例: VARCHAR)として保存する場合、空の列はそれほど(どんな?)スペースを占有しません。 これには、固定長のフィールドのみを持つテーブルと比較して、ルックアップが遅くなるという犠牲が伴います。

個人的には、空の列(スパーステーブルとも呼ばれる)が多数ある場合でも、空の列を使用しても問題ないと思います。 一部のデータベースには、スパーステーブルの最適化さえあります。 多くの余分なテーブルを作成し始めると、ロジックがより複雑になり、参照整合性の維持が難しくなります。

customers`テーブルでできることは、 customers`テーブルと1対1の関係を持つ1つの追加の `customer_profiles`テーブルを持つことです。 「customers_profiles」テーブルの「customers」と残りの部分(つまり、毎回顧客を検索する必要のないもの)に重要な情報を保存します。


1


最適化のキックをしている場合、私のアドバイスはそれをやめることです:-)

最適化は、気まぐれではなく、パフォーマンスの問題に対応して実行する必要があるものです。 パフォーマンスの問題がなければ、すべての最適化は無駄な努力です。

空のフィールドが適切に設計されたスキーマでのデータ取得に大きな違いをもたらすことはめったにありません。ほとんどのクエリでは、取得する行を決定するためだけにインデックスを使用する必要があるためです。 行が検出されると、実際のデータを取得するためにテーブルに移動します。

また、列が別のテーブルに格納されているからといって、インデックス作成の速度は変わりません。 インデックスを作成する必要がある場合は、インデックスを作成する必要があります。

不要な結合を回避するために、スキーマはできるだけシンプルにすることをお勧めします(ただし、ほとんどが3NFのままです)。


1


外部テーブルを使用して補助データをホストすることは、null許容列と同様にオプションの1つです。

スペースを節約できますが、テーブルを結合するにはより多くのリソースが必要です。

モデルがスパースマトリックス(多くの属性は定義されません)である場合、これらの属性を保存およびスキャンするコストは、 `JOIN`のコストをオーバーウエイトする可能性があります。

ただし、テーブルを追加すると、異なるテーブルの2つの属性をカバーするインデックスを作成できなくなります。

通常、リレーショナルモデルでは、複数のメソッドを使用して「ER」モデルを実装できます。これがまさにそれを示しています。

この記事を読むことをお勧めします。