根据where子句索引正确的列

时间:2012-05-28 16:31:10

标签: sql performance optimization indexing

我有一张包含消息的表。 我有idfromto等列。 如果我想为特定用户显示Inbox,我会用

编写一个select语句
where to = 'username' order by id desc limit 0,20;

这将显示该用户的前20条消息。显然我应该在to列上放置索引,并且id列上已有索引,因为它是主键,但最好是设置索引(to,{{1}一起?

1 个答案:

答案 0 :(得分:3)

不幸的是,答案比SO更合适。人们已就这方面写过书。

在简单的级别上,在(to, id DESC)上建立索引将是解决该查询的最佳选择。索引中的第一个字段确保数据易于搜索,并且所有感兴趣的记录都在一个连续的块中。索引中的第二个字段确保对该连续块进行预排序,这使得查找前20个记录变得微不足道。

但维护该指数也是一个问题。这样的索引可能非常容易碎片化。是否有能力在夜间维护工作中重建索引?您拥有的索引越多,磁盘空间开销就越大。您是否有磁盘空间为每个可能需要它的查询创建新索引?并且额外索引会增加写入开销。写入表的频率是多少,并且具有最小延迟的重要性如何?除了要过滤/搜索/加入的字段之外,添加要查询的字段也意味着您只需要读取索引而不是“加入”基表。这种收益是否值得进一步增加拥有更多更广泛指数的开销?

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

相关问题