索引搜索是否适用于带有按位运算的where子句?

时间:2013-09-09 10:16:16

标签: mysql sql indexing bit-manipulation where

我有一个带有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:我发现它是这样的,我可以尝试将标志分解为尽可能多的布尔列但是很难实现这一点,所以除非你能给我很强的理由这样做不建议将它作为一种选择..

1 个答案:

答案 0 :(得分:1)

在按位运算中不使用索引。 如果应用程序逻辑允许您计算组合

,则最好使用此查询
SELECT idRow, idThing,  morColumns FROM MyTable WHERE idUser = ? AND flags IN (combination1 ..combinationn);

另外,对它们使用布尔字段和索引并不是一个好主意,因为索引的选择性很差。 但是如果你必须在bool字段中拆分数据,你可以在真实字段上使用部分索引。