2014-11-06 26 views
2

我有以下的列:如何必要,是INDEX布尔字段

is_owned_by_admin TINYINT(1) NOT NULL DEFAULT 0; 

如果我查询这个领域很多,我需要一个索引添加到它,或者是布尔字段一样'快'作为索引布尔字段?有什么不同?

+0

与* all *索引一样,它依赖于多重性,因为它适用于查询和适用性(以及由查询规划器选择这种情况)作为索引。作为布尔/位本身与核心问题无关。不必要的索引的缺点是增加了存储和内部插入/更新维护成本(并且可能使基本查询计划人员感到困惑)而没有相关收益。 – user2864740 2014-11-06 23:39:21

+0

http://stackoverflow.com/questions/10524651/is-there-any-performance-gain-in-indexing-a-boolean-field – vch 2014-11-06 23:39:34

回答

2

问题中没有足够的信息来给出明确的答案。

最普遍的答案:只通过在一个布尔列上添加索引就没有好处。

这是因为只有两个值,如果这些值均匀分布,则索引不会提高性能。如果您一直在寻找具有最不经常出现的值的行,例如少于5%或10%的行,那么索引就会很有用。在这种特殊情况下,它可能会提高性能。

我强烈怀疑这不是您的查询中唯一的谓词。可能的话,在其他列上还有其他谓词。并且将该布尔列作为另一个索引中的额外列添加到查询中,这可能实际上会带来一些好处。

创建和维护索引有一些开销(它不是免费的),因此必须权衡索引的好处。将一个额外的列添加到现有的索引将会很便宜。


最合适的索引将取决于您正在查询的表以及您正在执行的实际SQL语句。

+0

而最重要的是,TINYINT 1甚至没有布尔值 – 2014-11-07 00:12:43

+0

@Hanky웃Panky :'TINYINT(1)'确实不是一个真正的布尔数据类型。我们实际上可以存储256个不同的值。 (长度说明符不限制可以存储的值的范围,我们需要触发器来实现这种限制。)但是TINYINT(1)是布尔型ORM映射的共同目标。这很方便,因为客户端库中没有任何问题。在我们的shiop中,我们仅将TINYINT(1)用于布尔值。 (NULL为NULL,0为FALSE,其他都为TRUE。) – spencer7593 2014-11-07 02:48:15

0

没有太多细节,答案是,如果您通常搜索其中一个布尔值并且该值相对较少,则只应考虑对其进行索引。也就是说:如果只有很少的页面是“is_owned_by_admin = 1”,并且您正在进行搜索以寻找相当数量的搜索,那么您可以考虑编制索引。但即使在这种情况下,索引的开销可能也不值得。