索引MYSQL中的位字段

时间:2011-03-07 03:20:20

标签: mysql indexing

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

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

select * from xxx where field=1;

3 个答案:

答案 0 :(得分:4)

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

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


更新后的问题表示值为1的值的数量很小(小于1%);一个指数现在会给你一个好处吗?

答案是:

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

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

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

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

答案 1 :(得分:0)

是。但是你可能不希望因为这么小的领域的更新而受到影响;如果你的行是50/50 0或1,那么全表扫描可能仍然是合理的。

答案 2 :(得分:0)

确实,这些值不是唯一的,因此它必须扫描所有值,并且不会从二进制搜索中获得任何性能提升。

然而,还有其他事情需要考虑。如果数据库很大并且不适合内存,那么它必须先将数据加载到内存中,然后才能查看它。如果存在包含数据的索引,则加载此索引的速度可能比整个表快得多。可能取决于表格的列数。