我有一个带有int的表,它存储了大约30个布尔标志。让我们建立一个例子:
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:我发现它是这样的,我可以尝试将标志分解为尽可能多的布尔列但是很难实现这一点,所以除非你能给我很强的理由这样做不建议将它作为一种选择..答案 0 :(得分:1)
在按位运算中不使用索引。 如果应用程序逻辑允许您计算组合
,则最好使用此查询SELECT idRow, idThing, morColumns FROM MyTable WHERE idUser = ? AND flags IN (combination1 ..combinationn);
另外,对它们使用布尔字段和索引并不是一个好主意,因为索引的选择性很差。 但是如果你必须在bool字段中拆分数据,你可以在真实字段上使用部分索引。