現在、MySQL データベースで列挙型を TINYINT として使用しています。私のテーブルには数百万行あります。次に、列挙型を TINYINT から別の場所の文字列にマップします。
これらの列挙型を文字列として保存することを検討しています。文字列が適切にインデックス化されている場合、TINYINT 列挙の代わりに文字列列挙でクエリを実行するときに MySQL がどのように実行されるかを知っている人はいますか?
助けに感謝します。ありがとう。
列挙型はルックアップ テーブルがあるかのように格納されるため、各行には数値参照のみが格納され、ルックアップ テーブルは別の場所に格納されます。技術的には、列挙型の整数値の照合は、2 つの値が同一であるため、整数の照合と同じくらい高速であり、文字列値の照合はわずかに遅くなります (すべてのインスタンスでバー 1)。ルックアップ テーブルを使用して整数値を検索し、それを使用してルックアップを実行します。
その 1 つの例は、存在しない値を検索する場合、存在しない値に対して enum の数値を照合してみてください。それでもすべてのデータを検索しますが、存在しない文字列値と照合してみてください。存在せず、ルックアップ テーブルを介した小規模な検索が行われ、データが検索される前に一致が返されません。
「はい/いいえ」または「男性/女性」の回答に列挙型を使用しないでください。数値データとルックアップ テーブルは、「ビット」値 (0 または 1) よりもはるかに多くのスペースを占めるためです。また、enum 定義で数値文字列を使用しないでください。たとえば、enum("1","0") のようにすると、コードやクエリを見る人が混乱するためです (保存されているルックアップ テーブルが [0 => "1 であるため)。 "、1 => "0"]。
(TINYINT を使用していてルックアップ テーブルがあると仮定します) TINYINT の方が高速ですが、結合が原因でパフォーマンスが低下する可能性があります。
列挙値が変わらない場合 (たとえば、男性、女性のタイプ、はい、列挙型がない場合) は、代わりに MYSQL ENUM フィールドを使用してください。1 バイトを使用して格納され (列挙値が 255 未満の場合)、結合は必要ありません。
ただし、思い切って ENUM データ型の長所と短所をすべて読んでから警告してください。
TINYINT(またはINTEGERその目的のために) より高速にインデックスが作成され、 or よりも SORT または SELECT のパフォーマンスが向上しVARCHARますCHAR。
ですから、あなたに答えるために、ええ、文字列は適切にインデックス化されていますが、パフォーマンスが低下する可能性があります. それがどれほど重要かはわかりません。
さらに 1件の情報を編集
小さいようVARCHARに見えINTEGER、インデックス作成のパフォーマンスの違いはごくわずかです。ここを参照してください http://forums.mysql.com/read.php?115,251611,252006#msg-252006
これらのベンチマークによると、列挙型はわずかに優れているようです。