2011-03-07 61 views
6

更新后的问题:
假设我感兴趣的数据只是那些field = 1的数据,实际的数据比率是1,而0的数据非常小(例如1%) 在这种情况下,将索引字段的好处我的select where field = 1查询?在MYSQL中索引一个位域

原题:
我有,将有0或1值的int字段,索引将这一领域加快选择的查询,如:

 
select * from xxx where field=1; 

回答

4

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

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


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

答案是:

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

  • 对于那些值为0的查询,不应使用索引。尽管如此,DBMS仍然会继续保持0值的索引 - 尽管它不应该使用它们。这将是一个不寻常的数据库管理系统,可以命令'只为零以外的值索引这一列',尽管这样做会非常有益。

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

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

0

是。但是您可能不希望将这样一个小领域的更新带来随之而来的性能下降;如果您的行是50/50 0或1,则全表扫描可能仍然合理。

0

确实这些值不是唯一的,所以它必须扫描所有的值,并且二进制搜索没有任何性能改进。

但是,还有其他的东西需要考虑。如果数据库很大并且不适合内存,那么在数据库可以查看之前它必须将数据加载到内存中。如果存在包含数据的索引,那么加载该索引的速度可能比整个表快得多。可能取决于表格有多少列。