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