我有一张有消息的桌子。所以我有列,,,id
等from
。to
如果我想为特定用户显示收件箱,我会写一个选择语句
where to = 'username' order by id desc limit 0,20;
这将显示该用户的前 20 条消息。所以显然我应该在列上放置索引to
,并且 id 列上已经有一个索引,因为它是一个主键,但是在 ( to
, id
) 上设置索引会更好吗?
我有一张有消息的桌子。所以我有列,,,id
等from
。to
如果我想为特定用户显示收件箱,我会写一个选择语句
where to = 'username' order by id desc limit 0,20;
这将显示该用户的前 20 条消息。所以显然我应该在列上放置索引to
,并且 id 列上已经有一个索引,因为它是一个主键,但是在 ( to
, id
) 上设置索引会更好吗?
不幸的是,答案比适合 SO 的要大。人们已经写了这方面的书。
在简单的层面上,拥有一个索引(to, id DESC)
将是解决该查询的最佳选择。索引中的第一个字段确保数据易于搜索,并且所有感兴趣的记录都在一个连续的块中。索引中的第二个字段可确保对连续块进行预排序,从而轻松找到前 20 条记录。
但维持该指数也是一个问题。这样的索引可能很容易产生碎片。是否有能力在夜间维护工作中重建索引?并且您拥有的索引越多,磁盘空间开销就越大。您是否有磁盘空间为可能需要的每个查询创建一个新索引?额外的索引会增加写入开销。表多久被写入一次,最小延迟有多重要?添加您将要查询的字段,除了您正在过滤/搜索/加入的字段之外,还意味着您只需要读取索引而不需要“加入”到基表。这种好处是否值得进一步增加拥有更多和更广泛索引的开销?
这是一个很好的问题,有一个非常广泛的答案,我在这里只提到了表面。