2011-01-08 4 views
0

私は現在、MySQLデータベース内TINYINTsとして列挙型を使用します。私のテーブルには数百万行があります。 TINYINTの列挙体を別の場所の文字列にマップします。MySQLでは文字列の列挙型を使用した - パフォーマンスの問題

私は、文字列としてこれらの列挙型を格納検討しています。文字列が適切にインデックス化されている場合は、いずれかの文字列の列挙型の代わりに、TINYINTの列挙型を照会する場合、MySQLはどのように実行するかを知っていますか?

ヘルプを評価してください。ありがとう。

+0

Can MySQLのENUM(http://dev.mysql.com/doc/refman/5.0/en/enum.html)データ型を使用しているかどうかを明確にしますか? – Nishant

答えて

0

列挙型は、TINYINTは高速ですが、あなたが原因で参加するのいくつかのパフォーマンスのヒットを見終わるかもしれない(あなたがTINYINTを使用してルックアップテーブルを持っていると仮定)have a slight edge, according to these benchmarks.

0

TINYINT(またはその目的ではINTEGER)は、インデックスが早くなり、SORTまたはSELECTでのパフォーマンスがVARCHARまたはCHARよりも高くなります。

だから、あなたに答えるために、ええ文字列は適切にインデックス化されているが、パフォーマンスがダウンする可能性があります。私はそれがいかに重要であるかを伝えることはできません。


編集1詳細

VARCHAR小さいように思えるとINTEGERはインデックスでは無視パフォーマンスの違いがあります。ここを参照してくださいhttp://forums.mysql.com/read.php?115,251611,252006#msg-252006

1

ように見えます。

私のアドバイスでは、列挙値が変更されない場合(たとえば、男性型、女性型、列挙型なし)、代わりにMYSQL ENUMフィールドを使用してください。 1バイトを使用して格納されます(列挙値が255未満の場合)。そのため、結合が必要ありません。

しかし警告し、プランジをとる前に、ENUMデータ型のすべての長所と短所を読み取ること。

3

列挙型はルックアップテーブルがあるかのように格納されるため、数値参照のみが各行に格納され、ルックアップテーブルは別の場所に格納されます。技術的には、列挙型の整数値を一致させることは、2つが同じであるように整数にマッチングすることと同じくらい速く、文字列値をマッチングすることはわずかに「検索」が1つだけ行われるため、ルックアップテーブルを使用して整数値を検索し、ルックアップの実行に使用します。

存在しない値を検索する場合は、存在しない値に対してenumの数値を一致させてみてください。それでもすべてのデータを検索しますが、文字列が存在しない値、およびルックアップテーブルによる小さな検索は、任意のデータが検索される前に、一致を返さない、行われます。

数値データとルックアップテーブルは "ビット"値(0または1)よりもはるかに広いので、 "はい/いいえ"または "男性/女性"の回答にはenumを使用しないでください。また、列挙型定義で数値文字列を使用しないでください。 (0 => "1"、1 => "0"のため、コードとクエリを見ている人は混乱しているので、enum( "1"、 "0")を使用してください。

関連する問題