1

私には仕事があります:

データベース内のレコードは次のステータスになります。

NEW = 1
CONFIRMED = 2
FINISHED = 3
DELETED = 4

1.

それらを int フィールドに格納し、インデックスを付けて、次のように選択できます。

... WHERE status = FINISHED ...
... WHERE status = DELETED ...

2.

また、それらを 4 つの個別のブール値フィールドとして保存することもできます

次に選択します。

... WHERE finished_field = True ...
... WHERE deleted_field = True ...

(select の場合) 1 と 2 のどちらの場合がパフォーマンスが優れていますか? また、ケース 2 の場合、フィールドのインデックスを作成する必要がありますか?

4

3 に答える 3

0

最初のオプションでは、そのフィールドにインデックスを付けることができるため、パフォーマンスが向上する可能性が高くなります。十分な異なる値がなく、MySQLはそのインデックスを無視するため、ブールフィールドにインデックスを付けることは効果がありません。

1つのフィールドを使用すると、インデックスが実際に使用される可能性が高くなります。

最後に、いくつかの実用的な考慮事項があります。最初のオプションを使用すると、別のタイプのステータスを簡単に追加できます。これにより、1つのレコードが1つのステータスのみを持つことができ、テーブルのサイズが小さくなります。

于 2012-10-11T12:27:05.963 に答える
0

パフォーマンスはおそらく重要ではありません。さらに重要なのはデータベースの設計です。4ビットフィールドを使用する場合、複数のステータスをに設定することができますtrue。それは起こらないはずです。トリガーでそれを防ぐことができますが、ステータスは1つしかないため、ステータスフィールドは1つにすることをお勧めします。

そうすれば、複数のフィールドを組み合わせる必要がありません。

于 2012-10-10T18:05:13.720 に答える
0

パフォーマンスに関しては、それらがどのような違いをもたらすかはわかりませんが、保守性の観点からは、ステータスごとに列を持つよりも、異なる値を取ることができる単一のステータス フィールドを持つ方が良いでしょう。明日新しいステータスが必要な場合、2 番目のオプションではテーブル スキーマを変更する必要がありますが、最初のオプションでは新しいステータス識別子 (たとえば、"RESTORED = 5") を使用するだけで済みます。

于 2012-10-10T17:15:31.527 に答える