0

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

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

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

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

    该表将有一个主索引

    我会执行:

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

    两个表都有一个主索引

    我会执行:

    SELECT description FROM Comment 
    WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
    

哪个执行效率最高?

有一个更好的方法吗?

4

2 回答 2

1

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

alter table comment add index idxFlagged (isFlagged)

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

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

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

于 2012-04-13T01:45:20.917 回答
0

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

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

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

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

于 2012-04-13T09:45:51.413 回答