49

MySQL は、列のデータ型に応じて、テーブルの行形式を固定または動的として指定します。テーブルに TEXT や VARCHAR などの可変長の列データ型がある場合、行の形式は動的です。それ以外の場合は修正されています。

私の質問は、2 つの行形式の違いは何ですか? 一方は他方よりも効率的ですか?

4

5 に答える 5

59

この違いは実際には MyISAM にとってのみ重要であり、他のストレージ エンジンは違いを気にしません。 編集:多くのユーザーは、InnoDB が気にかけているとコメントしました: steampowered によるリンク 1、 Kaanによるリンク 2

固定幅の行を持つ MyISAM には、いくつかの利点があります。

  1. 行の断片化なし: 可変幅の行を使用すると、単一の行をデータ ファイル全体の複数のセクションに分割することができます。これにより、ディスク シークが増加し、操作が遅くなる可能性があります。OPTIMIZE TABLE を使用してデフラグすることは可能ですが、これは必ずしも実用的ではありません。

  2. データ ファイル ポインターのサイズ: MyISAM には、データ ファイルを参照する必要があるときに使用されるデータ ファイル ポインターの概念があります。たとえば、これは、行が実際に存在する場所を参照するときにインデックスで使用されます。固定幅サイズでは、このポインターはファイル内の行オフセットに基づいています (つまり、サイズに関係なく、行は 1、2、3 です)。可変幅では、ポインターはバイト オフセットに基づいています (つまり、行は 1、57、163 の可能性があります)。その結果、大きなテーブルではポインタを大きくする必要があり、テーブルのオーバーヘッドがさらに大きくなる可能性があります。

  3. 破損した場合の修正が容易になります。すべての行が同じサイズであるため、MyISAM テーブルが破損した場合、修復がはるかに簡単になり、実際に破損したデータのみが失われます。可変幅を使用すると、理論的には可変幅ポインターが混乱する可能性があり、その結果、データが不適切な方法でホースされる可能性があります。

固定幅の主な欠点は、より多くのスペースを浪費することです。たとえば、VARCHAR フィールドの代わりに CHAR フィールドを使用する必要があるため、余分なスペースが必要になります。

通常、フォーマットはスキーマに基づいて決定されるため、あまり選択肢はありません。ただし、これに向けて最適化しようとする varchar または単一の blob/text しかない場合は、価値があるかもしれません。たとえば、唯一の varchar を char に切り替えるか、BLOB を独自のテーブルに分割することを検討してください。

これについては、次のサイトでさらに詳しく読むことができます。

http://dev.mysql.com/doc/refman/5.0/en/static-format.html

http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html

于 2008-09-29T02:37:48.187 に答える
11

レコードを更新するときに、重要な違いが 1 つあります。行フォーマットが固​​定されている場合、レコードの長さに変更はありません。対照的に、行フォーマットが動的で、新しいデータによってレコードの長さが増加する場合、「オーバーフロー」データを指すリンクが使用されます (つまり、オーバーフロー ポインターと呼ばれます)。

これにより、テーブルが断片化され、一般的に速度が低下します。最適化するコマンド (OPTIMIZE TABLE) があり、問題を多少緩和します。

于 2008-09-29T02:32:48.713 に答える
4

Fixed は、すべての行がまったく同じサイズであることを意味します。つまり、データ ページの 3 行目をロードする必要がある場合、正確に P​​ageHeader+2*RowSize になり、アクセス時間がいくらか節約されます。

動的レコードの先頭を見つけるには、レコード オフセットのリストを参照する必要がありますが、これには追加の間接化が含まれます。

要するに、はい、動的行のパフォーマンスがわずかに低下します。いいえ、それほど大きなものではありません。問題があると思われる場合は、テストしてください。

于 2008-09-29T02:30:46.147 に答える
1

Fixed は動的よりも高速で安全である必要がありますが、文字長が固定されているという欠点があります。この情報は、http: //dev.mysql.com/doc/refman/5.0/en/static-format.htmlで見つけることができます。

于 2008-09-29T02:33:10.507 に答える