MySQL没有';使用按位函数在位字段上查询时不使用索引

MySQL没有';使用按位函数在位字段上查询时不使用索引,sql,mysql,bitwise-operators,Sql,Mysql,Bitwise Operators,我的MySQL表中有一个BIT类型的字段。我想使用位值存储记录的状态,例如: 1 = status1 2 = status2 4 = status3 8 = status4 每个记录可以同时具有多个状态。对于状态1和状态3,该值将为1+4=5。我可以使用以下工具查询表中状态为3的所有记录: SELECT * FROM `table` WHERE `statuses` & 4 我有关于状态的索引,但是解释告诉我没有使用索引。在这种情况下我可以使用索引吗 另外,使用单独的多对

我的MySQL表中有一个BIT类型的字段。我想使用位值存储记录的状态,例如:

1 = status1
2 = status2
4 = status3
8 = status4
每个记录可以同时具有多个状态。对于状态1和状态3,该值将为1+4=5。我可以使用以下工具查询表中状态为3的所有记录:

SELECT * 
  FROM `table` 
 WHERE `statuses` & 4 
我有关于
状态的索引
,但是
解释
告诉我没有使用索引。在这种情况下我可以使用索引吗


另外,使用单独的多对多链接表是更规范化的解决方案,但我希望有更多的“平面”结构。优化器很难使用位字段上的索引。考虑所有具有比特2(值“4”)的不同值:4, 5, 6、7, 12, 13、14, 15, 20、21, 22, 23、…优化器将如何有效地利用它?

索引的存在并不意味着优化器将选择使用它。您可能会发现此线程很有用:我将在表中有很多值,我需要确保在表增长时不会出现问题,关于如何检查的技巧?是否真的有理由这样做而不是仅仅使用4位列?这种类型的编程可能非常优雅和快速,但是当你把它交给其他人时,它需要更多的培训和文档。比尔,状态的数量不是固定的(但64位操作的最大值对我来说就足够了),所以我需要一些不依赖于添加新列的东西。我还没有弄清楚。最普遍的解决方案是将位分解成单独的字段。如果不能在原始表中完成,那么创建一个只包含拆分位字段的新表肯定会有所帮助。