【问题标题】:indexing the correct columns based on where clauses used根据使用的 where 子句索引正确的列
【发布时间】:2012-06-03 00:09:07
【问题描述】:

我有一张有消息的桌子。 所以我有列idfromto 等。 如果我想为特定用户显示收件箱,我会写一个选择语句

where to = 'username' order by id desc limit 0,20;

这将显示该用户的前 20 条消息。所以很明显我应该把索引放在to列上,而id列上已经有一个索引,因为它是主键,但是将索引设置在(toid)上会更好吗?

【问题讨论】:

    标签: sql performance optimization indexing


    【解决方案1】:

    不幸的是,答案比适合 SO 的要大。人们已经写了这方面的书。

    简单来说,在(to, id DESC) 上建立索引将是解决该查询的最佳选择。索引中的第一个字段确保数据易于搜索,并且所有感兴趣的记录都在一个连续的块中。索引中的第二个字段可确保对连续块进行预排序,从而轻松找到前 20 条记录。

    但维护该索引也是一个问题。这样的索引可能很容易产生碎片。是否有能力在夜间维护工作中重建索引?并且您拥有的索引越多,磁盘空间开销就越大。您是否有磁盘空间为可能需要的每个查询创建一个新索引?额外的索引会增加写入开销。表多久被写入一次,最小延迟有多重要?添加您将要查询的字段,除了您正在过滤/搜索/加入的字段之外,还意味着您只需要读取索引而不需要“加入”到基表。这种好处是否值得进一步增加拥有更多和更广泛索引的开销?

    这是一个很好的问题,答案非常广泛,我在这里只是触及了表面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多