このmysql選択クエリを最適化しようとしていますが、これを読む方法がわかりません。このクエリが WHERE 句の観点から何をしているのかを誰かが説明できるかどうか疑問に思っていました。
SELECT `id`, `size`, `download`, `mirror1`, `mirror2`, `mirror3`
FROM `entries`
WHERE (`flags` & '3') = '0';
AND
フラグに対して
ビット演算子を実行しています。これについては、http: //en.wikipedia.org/wiki/Bitwise_AND#ANDを参照してください。
バイナリの3は11であるため、フラグの下位2ビットが設定されていないかどうか(たとえば、0であるかどうか)を確認します。これは、where句に従ってAND演算子の結果が0である必要があるためです。
例(フラグの値が次のとおりであると想定):
Ex 1: 11101000 <-- WHERE clause would be true, since lower two bits are 0
Ex 2: 11111010 <-- WHERE clause would be false, since lower two bits are NOT 0
私はあなたが狙っていると仮定しています&
。これはbitwise AND
です。
それがどのように機能するかについての良い説明は、このウィキペディアの記事で見つけることができます:
ビット単位のANDは、同じ長さの2つのバイナリ表現を取り、対応するビットの各ペアに対して論理AND演算を実行します。最初のビットが1で、2番目のビットが1の場合、各位置の結果は1です。それ以外の場合、結果は0になります。これでは、2ビットの乗算を実行します。つまり、1×0 =0および1×1=1です。例:
0101 (decimal 5)
AND 0011 (decimal 3)
= 0001 (decimal 1)
この手法は、状態、ユーザー権限、または同様のものを非常にコンパクトな形式で保存するためによく使用されます。3
クエリがチェックする2つの特定の状態があると想定しています。
00000000 <- TRUE
00000001 <- FALSE
00000010 <- FALSE
00000011 <- FALSE
エントリテーブルからid、size、download、mirror1、mirror2、mirror3の各フィールドを選択します。ここで、2進数のAND3でフラグがゼロになります。
フラグは通常、保存用の数値に変換されるビットとして保存されます。フラグは通常オンまたはオフであるため、これはバイナリ0および1に対応します。したがって、0がオフになり、1がオンになる可能性があります。したがって、4つのフラグのシーケンスは、2進数で次のように表すことができます。00 1 1、(off、off、on、on)これは10進数の3に相当します。
10進数の3(2進数11)でAND演算された数値がゼロになるという条件を満たすには、数値の下位2ビットを0にする必要があるため、(2進数の場合):1 100または10100などはゼロを返します。 、ANDは両方の入力が1の場合にのみ1を返すためです。
flags
実際に「 WHERE ( & '3') = '0'; 」であることを確認できますか? 「 WHERE ( flags
& 3) = 0; 」の方が理にかなっていますか?
ケビン