InnoDBのクラスター化されたBツリーインデックスシステムを調査したとき、多くのNULL(または小さな)列の存在はInnoDBのパフォーマンスに大きな影響を与えないと思います。
過剰な列が存在すると、mysqlのパフォーマンスが低下しますか?
追伸実際にテストしてみましたが、大きな影響はありませんでした。ただし、高負荷時の比較になると思います。これが、この問題に関する技術的な推論について知りたいと思う理由です。
私が目にした唯一の害は、大きなテーブルに対してCOUNTクエリを実行することです。
InnoDBテーブルでSELECT COUNT(*) FROM mytable
を実行すると、全テーブルスキャンが生成されます。ただし、COUNT()が実際に行うことを考えてみてください。 _*
_は行全体を表します。 COUNT()は、NULL以外の列が存在するかどうかを判別できます。これを行う最も簡単な方法は、PRIMARY KEY列が順序位置の最初の列であることを確認することです。 PRIMARY KEY列は、定義により常にNOT NULLです。したがって、SELECT COUNT(*) FROM mytable
はSELECT COUNT(1) FROM mytable
と同じくらい高速です。
InnoDBは1000の数に上限を設けるので、過剰な列について心配する必要はありません。もちろん、IMHOのテーブルに(ストレージエンジンに関係なく)20〜30列があると高すぎます。 )または大きすぎる列データ。
TOASTテーブルを持つPostgreSQLの一種の解決。 TOASTは、Outside Attribute Storage Techniqueの略です。これは、通常の行ストレージには大きすぎる列データを管理します。
InnoDBにはTOASTのようなメカニズムがないため、_.ibd
_ファイル内またはibdata1内にある種の行チェーンが必要です。それにもかかわらず、NULL列は、特大の行データが物理的に現れるのを防ぎます。誰もがそれと共存できます。
InnoDBテーブルが適切にインデックス付けされている限り、NULL列は問題になりません。さらに、すべての非一意のインデックスには、内部のRowIDが クラスター化インデックス(別名gen_clust_index) に戻されます。したがって、適切に調整されたクエリは、常にクラスター化インデックスを介してデータにアクセスします。
Mysql Official Docによると:
可能であれば、列をNOT NULLとして宣言します。インデックスをより効果的に使用できるようにし、各値がNULLかどうかをテストするためのオーバーヘッドをなくすことで、SQL操作を高速化します。また、列ごとに1ビットのストレージスペースも節約できます。テーブルに本当にNULL値が必要な場合は、それらを使用してください。すべての列でNULL値を許可するデフォルト設定を避けてください。 http://dev.mysql.com/doc/refman/5.5/en/data-size.html