web-dev-qa-db-ja.com

MySQLのブール値のTINYINTとENUM(0、1)

MyISAMテーブルとMySQL5.1の値が0と1のTinyintとENUM0,1のどちらが良いですか?

26
Wiliam

mysql 5.1 reference で説明されているように、BIT(1)を使用できます。 tinyint(1)はブール値を格納するために1ビットしか必要としないのに対し、bit(1)は8ビットを必要とするため、enumまたはtinyint(1)はお勧めしません。

25
Adeel

私の調査によると、BIT(1)は、5.0.3より前のバージョンのMySQLのTINYINT(1)の同義語です。

5.0.3以降のMySQLバージョンでは、BITデータ型の動作方法が変更されています。これはTINYINTの同義語ではなくなり、1バイト未満で何でも格納できる唯一のデータ型です。

このデータ型は、TINYINTまたはENUMを使用するよりも好ましい場合があります。ブログで、どれが最速で、3つのスペース使用量が最も速いかをテストする予定です。サイズと速度の結果を確認したい場合は、下部にリンクがあります。テストベッド:OpenBSDとMySQLを実行している消費者向けの不器用なPentiumIIIボックス。 (DB開発ボックスが遅いと、悪いコードの影響を実際に感じることができます。また、テストクエリ間の違いがより明確になります。または、リソースがほとんど割り当てられていない状態でVMを使用してみてください。)

MySQLの公式ドキュメント。

バロンシュワルツはそれについてこう言っています。

http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/

4
BradChesney79

列挙型は、ある意味で、開発者またはプログラマーに「ヒント」を提供します。ただし、通常は、プログラムで処理することをお勧めします。したがって、ENUM(0,1)、BIT(1)、TINYINT(1)のいずれであっても、すべて1バイトを使用する場合は、ほとんどの場合、bit(1)で2を送信するよりも、クライアント側で処理する方が適切です。またはenum(0,1)をサーバーに送信すると、サーバーはとにかく処理する必要があるエラーを返します-より多くのリソースを使用します(ネットワーク+サーバーCPU +クライアントCPUx 2)

通常、0は偽、1は真を意味します。

1
kalabog76

何が期待されるかが明確になるため、ENUMの方が望ましいと思います。それが測定可能な方法でパフォーマンスを損なう場合、私は非常に驚かれることでしょう。 tinyintにこの作業を行わせるには、列の制約をCHECKする必要があります。現在、どのMySQLストレージエンジンもこれをサポートしていません。

1
Brian Hooper

最高のパフォーマンスとスペースの要件を得るには、ブール値を収集して同じTINYINTに保存する必要があります。例えば。 TINYINTに最大8つのブール値を保存します。 SMALLINTなどの16個のブール値。BIT(1)とENUMの両方が少なくとも1バイトを使用しますBIT(M) - approximately (M+7)/8 bytes参照: https://dev.mysql.com/doc/refman/8.0/en /storage-requirements.html 。したがって、1つのブール値を格納する場合は、BITおよびENUMと同じオーバーヘッドがあるため、TINYINTを使用しますが、必要に応じて、後でさらに7つのブール値を格納するオプションがあります。

0
Jens