0

約 30 のブール値フラグを格納する int を持つテーブルがあります。例を作成しましょう:

Table MyTable
idRow | idUser | idThing | flags | moreColumns

そのテーブルを頻繁にスキャンするクエリがあります。

SELECT idRow, idThing,  morColumns FROM MyTable WHERE idUser = ? AND flags = ?

したがって、インデックスは (idUser, flags) で構築されますが、ロジックの更新により、より多くのフラグの組み合わせでクエリを増やすか、本当に必要なフラグを示すビット単位の操作を許可する必要があることがわかっています。

SELECT idRow, idThing,  morColumns FROM MyTable WHERE idUser = ? AND (flags = combination1 OR flags = combination2 OR flags = combination3) -- may have to keep increasing in the future

または私が好む他のオプション:

SELECT idRow, idThing,  morColumns FROM MyTable WHERE (PRIVILEGE_FLAGS & flag) = flag;

しかし、作成されたインデックスがクエリに役立つかどうか、または他のオプションを使用する方が良いかどうかはわかりません。

ありがとうございました。

PS:私はこのように見つけました。フラグをできるだけ多くのブール値の列に分割してみることができるかもしれませんが、それを行うのは難しいので、そうする非常に強い理由を教えてくれない限り、しないでくださいオプションとしてそれを提案..

4

1 に答える 1

1

インデックスはビット演算では使用されません。アプリケーションロジックで組み合わせを計算できる場合は、このクエリを使用することをお勧めします

SELECT idRow, idThing,  morColumns FROM MyTable WHERE idUser = ? AND flags IN (combination1 ..combinationn);

また、インデックスの選択性が低いため、ブールフィールドとそれらのインデックスを使用することはお勧めできません。ただし、データを bool フィールドに分割する必要がある場合は、true フィールドで部分インデックスを使用できます。

于 2013-09-09T10:35:53.330 に答える