我有兴趣找到找到基于布尔属性从表中选择记录的最有效方法。
我的方案是我有一个表格,其中包含用户发表的评论,我想选择所有被标记为不当的评论。
我必须实现的两个想法是:
最合乎逻辑的一个,在评论表中有一个布尔属性'isFlagged'
该表将具有主索引
我会执行:
SELECT description FROM Comment
WHERE isFlagged = 1;
拥有一个表,其中包含Comment表中已标记的记录的主键
两个表都有一个主索引
我会执行:
SELECT description FROM Comment
WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
哪个会最有效地执行?
有更好的方法吗?
答案 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字段 - 但仅限于您提及的查询。试图找到有关单个评论的详细信息需要加入,这可能会更慢。
在实践中,除非您在极端情况下工作,否则您不太可能产生可衡量的性能影响。这就是为什么你应该建立一个试验台并试一试 - 理论差异可能没有现实世界的影响。