【问题标题】:Create index on a column with only 2 distinct values在只有 2 个不同值的列上创建索引
【发布时间】:2017-10-11 00:14:53
【问题描述】:

我有一张包含数百万条记录的表。

其中一列只有 2 个值 '0' 和 '1'。

我只关心列值为“0”的记录,并对这些记录进行一些处理。

考虑到包含值“0”的记录数将达到数百个,在该列上创建索引是否明智。

从那时起,索引将只有 2 个值“0”,对实际记录有数百个引用,而“1”则对其对应的数百万条记录进行引用。

因为我不关心 '1' 及其引用,我应该首先使用索引吗?

【问题讨论】:

  • 您使用的是哪个 RDMS?在 SQL Server 中,您可以使用过滤索引。

标签: sql database-indexes


【解决方案1】:

在包括软件工程在内的工程领域,您应该衡量结果,而不是猜测(或要求互联网上的人告诉您正确的做法)。

您应该使用 EXPLAIN 找出您的 SQL 数据库将如何优化不同的查询,给定您搜索的值。

由于 0 的行数与 1 的行数不平衡,您是对的,数据库优化搜索一个或另一个值的查询的方式可能会有很大差异。

如果您搜索 1,则读取索引的开销可能是一种浪费,因为它无论如何都会访问 99% 的行。所以一个好的优化器应该跳过索引,直接读取表,丢弃少数不匹配的行。

但如果您搜索少数值 0,优化器应该能够看出使用索引将是有益的。

使用 EXPLAIN 来验证这一点。使用 EXPLAIN 尝试两个查询(搜索 0 和搜索 1),看看优化器的计划有何不同。

我对 EXPLAIN 的语法含糊不清,因为您决定不具体说明您使用的是哪个品牌的 SQL 数据库。您只标记了您的问题“sql”和“database-indexes”,但没有标记“sql-server”或“mysql”或“postgresql”或您正在使用的任何内容。

EXPLAIN 不是标准 SQL 语言的一部分,因此每个数据库实现 EXPLAIN 的方式略有不同。具体答案取决于您使用的 SQL 数据库。

【讨论】:

    【解决方案2】:
    CREATE TABLE Detalii_Meciuri(
        DetaliiID int not null primary key identity(1,1),
        MeciID int FOREIGN KEY (MeciID)
        REFERENCES Meciuri(MeciID),
        Categoria_1 int not null check (Categoria_1 = 0 or Categoria_1 = 1) ,
        Categoria_2 int not null check (Categoria_2 = 0 or Categoria_2 = 1) ,
        Categoria_3 int not null check (Categoria_3 = 0 or Categoria_3 = 1) ,
        Categoria_4 int not null check (Categoria_4 = 0 or Categoria_4 = 1) ,
        Categoria_5 int not null check (Categoria_5 = 0 or Categoria_5 = 1) ,
        Puncte_Echipa_A int not null check (Puncte_Echipa_A > 0),
        Puncte_Echipa_B int not null check (Puncte_Echipa_B > 0),
    );
    

    【讨论】:

    • 我想你可能不小心回答错了问题
    猜你喜欢
    • 2011-01-30
    • 2010-12-25
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2013-09-28
    • 2021-01-12
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多