0

我有一个带有 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:我发现它是这样的,我可以尝试将标志分成尽可能多的布尔列,但很难做到这一点,所以除非你能给我非常充分的理由,否则请不要建议它作为一个选项..

4

1 回答 1

1

索引不用于按位运算。如果应用程序逻辑允许您计算组合,则最好使用此查询

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

此外,由于索引的选择性较差,因此使用布尔字段并对其进行索引也不是一个好主意。但是,如果您必须在 bool 字段中拆分数据,您可以在真实字段上使用部分索引。

于 2013-09-09T10:35:53.330 回答