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