【问题标题】:Does a table that stores a subset of primary keys from another table increase the efficiency of selective SELECT queries?存储来自另一个表的主键子集的表是否会提高选择性 SELECT 查询的效率?
【发布时间】:2012-04-25 10:11:56
【问题描述】:

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

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

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

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

    表会有一个主索引

    我会执行:

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

    两个表都有一个主索引

    我会执行:

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

哪个执行效率最高?

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: database performance indexing


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      alter table comment add index idxFlagged (isFlagged)
      

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

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

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

      【讨论】:

      • 对于正确的索引来说,如果有的话,所花费的时间可能无关紧要更多,因为这将是一个简单的哈希匹配(或者由查询规划器决定) )。 RDBMS 就是为这类事情而设计的。
      • 就个人而言,我会将它作为 cmets 表中的一列作为“它是评论的属性”,就像现在写的那样。然而,一个更复杂的标记系统和...
      • PostgreSQL 不会在布尔列上使用任何类型的索引的可能性很大。您可以使用EXPLAIN ANALYZE <query> 进行测试。
      猜你喜欢
      • 2014-12-15
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多