Database 存储另一个表的主键子集的表是否提高了选择性选择查询的效率?

Database 存储另一个表的主键子集的表是否提高了选择性选择查询的效率?,database,performance,indexing,Database,Performance,Indexing,我感兴趣的是找到基于布尔属性从表中选择记录的最有效方法 我的场景是,我有一个表,其中包含用户的评论,我想选择所有被标记为不合适的评论 我必须实施的两个想法是: 最符合逻辑的是,在注释表中有一个布尔属性“isFlagged” 该表将有一个主索引 我将执行: SELECT description FROM Comment WHERE isFlagged = 1; SELECT description FROM Comment WHERE commentID IN (SELECT FK_comm

我感兴趣的是找到基于布尔属性从表中选择记录的最有效方法

我的场景是,我有一个表,其中包含用户的评论,我想选择所有被标记为不合适的评论

我必须实施的两个想法是:

  • 最符合逻辑的是,在注释表中有一个布尔属性“isFlagged”

    该表将有一个主索引

    我将执行:

    SELECT description FROM Comment 
    WHERE isFlagged = 1;
    
    SELECT description FROM Comment 
    WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
    
  • 拥有一个表,该表保存注释表中已标记记录的主键

    两个表都有一个主索引

    我将执行:

    SELECT description FROM Comment 
    WHERE isFlagged = 1;
    
    SELECT description FROM Comment 
    WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
    
  • 哪一种执行效率最高


    有更好的方法吗?

    如果且仅当
    isFlagged
    字段上有索引时,我会选择第一种方法:

    alter table comment add index idxFlagged (isFlagged)
    
    此外,考虑到第二个查询只是一个连接(不需要子查询):


    我打赌它执行起来应该比遍历
    isFlagged
    字段上的索引花费更长的时间。无论如何,我建议您对这两种解决方案进行基准测试,并报告结果:)

    如果性能是您关心的问题,我建议您使用具有代表性的(测试)数据量测试这两种方案

    值得一提的是,大多数数据库系统都不能从低基数字段的索引中获益,尤其是。对于一个巨大的表,选项1将需要一个表扫描,这可能会很慢

    选项2应该更快,因为您可以为commentID字段编制索引,但只针对您提到的查询。尝试查找有关单个注释的详细信息需要加入,这可能会较慢


    在实践中,除非你在极端情况下工作,否则你不太可能对绩效产生可衡量的影响。这就是为什么您应该构建一个测试平台,并进行尝试——理论上的差异可能不会对现实世界产生影响。

    对于正确的索引来说,所花费的时间(如果有的话)可能更无关紧要,因为这将是一个简单的哈希匹配(或者由查询计划人员决定)。RDBMS’是为这类事情而设计的。就我个人而言,我会把它作为评论表中的一列,就像现在写的“它是评论的一个属性”。然而,更复杂的标记系统和…PostgreSQL很可能不会在布尔列上使用任何类型的索引。您可以使用
    EXPLAIN ANALYZE
    对其进行测试。