3

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

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

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

4

1 回答 1

3

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

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

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

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

于 2012-05-28T16:43:27.360 回答