索引MYSQL中的位字段

use*_*196 6 mysql indexing

更新的问题:
假设我感兴趣的数据只是那些field = 1且数据的实际比率为1对0的实际比率非常小(例如1%),在这种情况下,将索引我选择的字段利益where field = 1查询?

原始问题:
我有一个int字段,它将具有0或1值,将索引此字段加速选择查询,例如:

select * from xxx where field=1;

Jon*_*ler 5

一般来说,没有。双态字段在索引时不会加快查询速度,因为您必须平均查看一半的行。您希望索引条目具有选择性 - 索引中的给定条目应仅代表可能值的一小部分(例如,小于 10%,最好是百分之几)。然后使用索引会忽略表中的大部分数据,这会给您带来性能优势。

一些 DBMS 支持位图索引。它们可以提供帮助,但您仍然会遇到选择性问题。


更新的问题说值为 1 的值的数量会很少(小于百分之一);指数现在会给你带来好处吗?

答案是:

  • 对于那些指定值为 1 的查询,是的,列上的索引可以提供好处,前提是优化器实际上使用了索引。您可能需要调整 DBMS 以使其意识到索引偏向于将其用于值为 1 的查询;这往往是特定于 DBMS 的,但以各种形式更新统计数据是游戏的名称,也可能在 SQL 查询中使用提示。当然,如果优化器从不使用索引,那么它仍然没有任何好处——优化器可能会决定其他索引以某种方式帮助它更多。

  • 对于值为 0 的查询,不应使用索引。但是,DBMS 也有可能继续维护 0 值的索引 - 即使它永远不应该使用它们。这将是一个不寻常的 DBMS,它可以被命令“仅针对零以外的值对该列进行索引”,即使这非常有益。

所以 - 这取决于。这取决于查询,也取决于优化器。

还要注意复合索引 - 在一些其他常用的列上,然后位域可能会提供一些好处。因此,如果您几乎总是选择日期范围,那么日期和位字段列上的复合索引(可能按该顺序)应该为您提供一个很好的索引。