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
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
对其进行测试。