【问题标题】:How necessary is it to INDEX boolean fields索引布尔字段的必要性
【发布时间】:2015-01-03 16:02:51
【问题描述】:

我有以下列:

is_owned_by_admin TINYINT(1) NOT NULL DEFAULT 0;

如果我经常查询该字段,是否需要向其添加 INDEX,或者布尔字段是否与索引布尔字段一样“快速”?有什么区别?

【问题讨论】:

  • all 索引一样,它取决于应用于查询的多重性和作为索引的使用(以及查询计划器的选择)的适用性。作为一个布尔值/位本身与核心问题无关。不必要的索引的缺点是增加了存储和内部插入/更新维护成本(并且可能使基本查询计划者感到困惑)而没有相关收益。

标签: mysql


【解决方案1】:

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

最一般的答案:仅在一个布尔列上添加索引没有任何好处。

这是因为只有两个值,如果这些值分布均匀,索引不会提高性能。仅当您始终在查找具有最不常出现的值的行时,该索引才有用,例如少于 5% 或 10% 的行。在这种特殊情况下,它可能会提高性能。

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

创建和维护索引会产生一些开销(它不是免费的),因此必须权衡拥有索引的好处。向现有索引添加额外的列会便宜得多。


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

【讨论】:

  • 除此之外,TINYINT 1 甚至都不是布尔值
  • @Hanky웃Panky:TINYINT(1) 确实不是布尔数据类型。我们实际上可以存储 256 个不同的值。 (长度说明符不限制可以存储的值的范围,我们需要触发器来实现这种限制。)但是 TINYINT(1) 是布尔值的 ORM 映射的常见目标。这很方便,因为它在客户端库中没有任何问题。在我们的 shiop 中,我们将 TINYINT(1) 专门用于布尔值。 (NULL 为 NULL,0 为 FALSE,其他为 TRUE。)
【解决方案2】:

无需过多详细说明,答案是,如果您经常搜索其中一个布尔值并且该值相对稀有,则应仅考虑对其进行索引。

也就是说:如果总页面中“is_owned_by_admin=1”的页面很少,并且您正在执行的搜索往往希望找到其中相当多的页面,那么您可能会考虑编制索引。但是即使在这种情况下,索引的开销也可能不值得。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2020-06-01
    • 2022-01-12
    相关资源
    最近更新 更多