web-dev-qa-db-ja.com

MySQL Row Format:固定と動的の違いは?

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

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

45
moo

違いは本当にMyISAMにのみ関係し、他のストレージエンジンは違いを気にしません。 EDIT:多くのユーザーがInnoDBが気にかけているとコメントしました: link 1 by steampoweredlink 2 by Kaan =。

行幅が固定された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

57
Harrison Fisk

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

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

10
Ben Hoffstein

MySQLのドキュメントのこのページは、動的な行形式がInnoDBテーブルにも何かを意味するという点で、ここでのトップの答えと矛盾しているようです。

http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html

7
B T

固定とは、すべての行がまったく同じサイズであることを意味します。つまり、データページの3番目の行を読み込む必要がある場合、PageHeader + 2 * RowSizeになり、アクセス時間を節約できます。

ダイナミックレコードの先頭を見つけるには、レコードオフセットのリストを参照する必要がありますが、これには余分な間接参照が含まれます。

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

4
Jonathan Rupp

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

1
jmissao