存储来自另一个表的主键子集的表是否会提高选择性SELECT查询的效率?

时间:2012-04-13 01:33:49

标签: database performance indexing

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

我的方案是我有一个表格,其中包含用户发表的评论,我想选择所有被标记为不当的评论。

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

  1. 最合乎逻辑的一个,在评论表中有一个布尔属性'isFlagged'

    该表将具有主索引

    我会执行:

    SELECT description FROM Comment 
    WHERE isFlagged = 1;
    
  2. 拥有一个表,其中包含Comment表中已标记的记录的主键

    两个表都有一个主索引

    我会执行:

    SELECT description FROM Comment 
    WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
    
  3. 哪个会最有效地执行?

    有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

当且仅当你在isFlagged字段上有索引时,我会选择第一个:

alter table comment add index idxFlagged (isFlagged)

此外,请考虑您的第二个查询只是一个连接(不需要子查询):

select description from Comment c
join FlaggedComment fc on c.commentId = fc.fkCommentId

我敢打赌,执行比执行isFlagged字段上的索引需要更长的时间。无论如何,我建议你对这两个解决方案进行基准测试并报告结果:)

答案 1 :(得分:0)

如果您关注性能,我建议您使用具有代表性的(测试)数据来测试两种情况。

对于它的价值 - 大多数数据库系统不会受益于基数较低的字段上的索引 - 尤其是booleans。对于一个巨大的表,选项1需要一个表扫描,这可能很慢。

选项2 应该更快,因为您可以索引commentID字段 - 但仅限于您提及的查询。试图找到有关单个评论的详细信息需要加入,这可能会更慢。

在实践中,除非您在极端情况下工作,否则您不太可能产生可衡量的性能影响。这就是为什么你应该建立一个试验台并试一试 - 理论差异可能没有现实世界的影响。