1

私の tinyint フィールドには 6 つの可能なオプションがあり、ユーザーは検索ごとに受け入れ可能なオプションを選択します。現在、各オプションを単純に 0 ~ 6 の値として保存し、受け入れ可能なオプションごとに WHERE で個別の句を実行しています。例 (ユーザーが選択したオプション 0、3、および 4):

SELECT * FROM table WHERE type = 0 OR type = 3 OR type = 4

データを 1、2、4、8、16、および 32 として格納した場合に高速になるかどうかを知りたくて、ビットごとの検索を実行しました。

SELECT * FROM table WHERE type & 25

最初のオプションは通常、インデックスを作成して高速化できると思いますが、このテーブルは実際には 43 のフィールドであり、そのうち 33 はさまざまな操作を含めて検索可能です。(多くの場合、クエリは終了するまでに多くの AND を持っています。) 多くのフィールドにインデックスを付ける必要があるだけでなく、インデックスを作成する利点が無効になるのではないでしょうか?

4

1 に答える 1

1

優れたオプティマイザーは、これらのオプションの両方でほぼ同じ速度を生成する必要があります。私は、ロジックにより適した解決策を選択します。プログラムで型 0 から 6 を使用している場合は、データベースに 0 から 6 の数値を格納する方がよいでしょう。

IN演算子を使用して、クエリを読みやすくすることもできます。

SELECT * FROM table WHERE type IN (0, 3, 4)
于 2014-11-30T23:34:56.947 に答える