2009-04-19 31 views

答えて

39

ような操作のためENUMを使用することに大きな性能ペナルティあり:ドロップダウンメニューを取り込むために、例えば、ENUMにおける許容値の

  • クエリーリスト。 INFORMATION_SCHEMAからデータ型をクエリし、返されたBLOBフィールドからリストを解析する必要があります。

  • 許容値のセットを変更します。 ALTER TABLEステートメントが必要です。このステートメントは、テーブルをロックし、再構成を行う可能性があります。

私はMySQLのENUMのファンではありません。私は参照テーブルを使用することを好む。 「How to handle enumerations without enum fields in a database?

+4

私の列挙値は人口統計(W、B、A、H、O、U)、性別(M、F、U)および党(R、 D、I、U)は決して変わらないだろう。彼らはいつも私のアプリケーションロジックにハードコードすることができます。そのため、ドロップダウン値をクエリして構造を変更することはそれほど大きな要因ではありません。 – gsueagle2008

+33

"私の列挙値は決して変更されません"。そのステートメントが間違っていることが何回証明されたかについてのいくつかの統計を得るためには**愛**でしょうか。 – benmarks

+2

記載されている箇条書きの点は真ですが、特にその列で注文している場合、ENUMはJOINSよりも高速です。設定値が変更されないgenderのような列の場合は、ENUMを使用することをお勧めします。しかし、値を追加または削除する必要がある可能性がある場合は、JOINを使用するか、CHAR/VARCHAR/TINYINTを使用してアプリケーションレベルで管理してください。もう1つのこと... MySQLは列内の実際の値をインデックス(INT)だけに保存​​しないので、フルテキスト文字列を使用してユーザーに表示することができます。コーディング。;-) – Jabari

1

いいえ、利点は、コードの読みやすさに産む比較here

を参照してください。

+10

リンク先の記事によると、可能な状態を変更していない限り、ENUMを使用するとパフォーマンスが向上します。 –

24

ENUMは、値の数に応じて内部的に1または2バイトで表されます。格納している文字列が2バイトより大きく、めったに変更されない場合は、ENUMを使用します。列挙型で比較が高速になり、ディスク上のスペースが少なくなり、シーク時間が短縮されます。

値の追加/削除に関しては、列挙型の柔軟性が低いという欠点があります。

+0

あなたが参照しているMySQLのバージョンがわかりません。しかし、5.0以降では、列挙型のサイズは、マニュアルに従って可能な値の数に応じて1または2バイトです:http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.htmlわずか5〜10の値があり、サイズは1バイトでなければなりません。 – Lacek

+0

@Lacekあなたは正しいです!回答を16ビットから1または2バイトに変更します –

9

この記事では、http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/フェルナンドは、クエリの列挙型のパフォーマンスを調べています。

ENUMの値が時々変更されている場合、ENUMを使用してデザインの観点から少しエレガントに見えるかもしれませんが、大きなデータセットではパフォーマンスが向上します。 詳細については、彼の記事を参照してください。同意しますか?