値が 0 と 1 の Tinyint と、MyISAM テーブルと MySQL 5.1 の ENUM 0,1 のどちらが優れていますか?
5 に答える
mysql 5.1 リファレンスBIT(1)
に記載されているように使用できます。ブール値を格納するために1ビットしか必要としないのに、8ビットが必要であることをお勧め
しません。enum
tinyint(1)
bit(1)
tinyint(1)
私の調査によると、5.0.3 より前のバージョンの MySQL では、BIT(1) は TINYINT(1) の同義語です。
5.0.3 以降の MySQL バージョンでは、BIT データ型の動作が変更されています。これはもはや TINYINT のシノニムではなく、何でも 1 バイト未満で格納できる唯一のデータ型です。
このデータ型は、TINYINT または ENUM を使用するよりも好ましい場合があります。私のブログで、どれが最速であるか、3 つのスペース使用量をテストする予定です。サイズと速度の結果を確認したい場合は、下部にリンクがあります。テストベッド: OpenBSD と MySQL を実行する消費者向けグレードの Pentium III ボックス。(遅い DB 開発ボックスでは、悪いコードの影響を実際に感じることができます。また、テスト クエリ間の違いがより識別しやすくなります。または、リソースがほとんど割り当てられていない VM を使用してみてください。)
MySQL 公式ドキュメント。
- v5.1 - http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html
- v5.6 - http://dev.mysql.com/doc/refman/5.6/en/numeric-type-overview.html
バロン・シュワルツはそれについてこう言っています。
Enum はある意味で、開発者やプログラマーに「ヒント」を与えます。ただし、通常は、プログラムで処理する方が適切です。したがって、ENUM(0,1)、BIT(1)、TINYINT(1) のいずれであっても、すべて 1 バイトを使用する場合、ほとんどの場合、bit(1) で 2 を送信するよりも、クライアント側で処理する方がよいでしょう。または enum(0,1) をサーバーに送信すると、サーバーはとにかく処理する必要があるエラーを返します-より多くのリソースを使用します(ネットワーク+サーバーCPU +クライアントCPU x 2)
通常、0 は false、1 は true を意味します。
何が期待されているかが明確になるため、ENUMの方が望ましいと思います。それが測定可能な方法でパフォーマンスを損なう場合、私は非常に驚くでしょう. tinyint にこの作業を行わせるには、列の制約を CHECK する必要があります。現在、これをサポートしている MySQL ストレージ エンジンはありません。
最高のパフォーマンスとスペース要件を得るには、ブール値を収集して同じ TINYINT に保存する必要があります。例えば。TINYINT に最大 8 つのブール値を保存します。SMALLINT などの 16 個のブール値。BIT(1) と ENUM の両方で少なくとも 1 バイトを使用します。 https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlBIT(M) - approximately (M+7)/8 bytes
を参照してください。したがって、1 つのブール値を保存する場合は、BIT および ENUM と同じオーバーヘッドがあるため、TINYINT を使用しますが、必要に応じて後でさらに 7 つのブール値を保存するオプションを提供します。