MyISAMテーブルとMySQL5.1の値が0と1のTinyintとENUM0,1のどちらが良いですか?
mysql 5.1 reference で説明されているように、BIT(1)
を使用できます。 tinyint(1)
はブール値を格納するために1ビットしか必要としないのに対し、bit(1)
は8ビットを必要とするため、enum
またはtinyint(1)
はお勧めしません。
私の調査によると、BIT(1)は、5.0.3より前のバージョンのMySQLのTINYINT(1)の同義語です。
5.0.3以降のMySQLバージョンでは、BITデータ型の動作方法が変更されています。これはTINYINTの同義語ではなくなり、1バイト未満で何でも格納できる唯一のデータ型です。
このデータ型は、TINYINTまたはENUMを使用するよりも好ましい場合があります。ブログで、どれが最速で、3つのスペース使用量が最も速いかをテストする予定です。サイズと速度の結果を確認したい場合は、下部にリンクがあります。テストベッド:OpenBSDとMySQLを実行している消費者向けの不器用なPentiumIIIボックス。 (DB開発ボックスが遅いと、悪いコードの影響を実際に感じることができます。また、テストクエリ間の違いがより明確になります。または、リソースがほとんど割り当てられていない状態でVMを使用してみてください。)
MySQLの公式ドキュメント。
バロンシュワルツはそれについてこう言っています。
列挙型は、ある意味で、開発者またはプログラマーに「ヒント」を提供します。ただし、通常は、プログラムで処理することをお勧めします。したがって、ENUM(0,1)、BIT(1)、TINYINT(1)のいずれであっても、すべて1バイトを使用する場合は、ほとんどの場合、bit(1)で2を送信するよりも、クライアント側で処理する方が適切です。またはenum(0,1)をサーバーに送信すると、サーバーはとにかく処理する必要があるエラーを返します-より多くのリソースを使用します(ネットワーク+サーバーCPU +クライアントCPUx 2)
通常、0は偽、1は真を意味します。
何が期待されるかが明確になるため、ENUMの方が望ましいと思います。それが測定可能な方法でパフォーマンスを損なう場合、私は非常に驚かれることでしょう。 tinyintにこの作業を行わせるには、列の制約をCHECKする必要があります。現在、どのMySQLストレージエンジンもこれをサポートしていません。
最高のパフォーマンスとスペースの要件を得るには、ブール値を収集して同じ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つのブール値を格納するオプションがあります。