【问题标题】:Does indexed search applies in a where clause with a bitwise operation?索引搜索是否适用于按位运算的 where 子句?
【发布时间】:2013-09-09 10:16:15
【问题描述】:

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

【问题讨论】:

  • EXPLAIN 说什么?
  • 很多东西,我都不知道怎么解释...要去研究解释。
  • 哇...我明白了。精彩的!谢谢你教人钓鱼!

标签: mysql sql indexing bit-manipulation where


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,应用程序允许我使用组合。
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多