【发布时间】: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