包括列的非聚集索引



假设我有一个包含许多列(例如20列)的表,我经常按其中一列进行搜索。如果我为该列创建非聚集索引,那么我知道我还应该包括select语句中的其他列来覆盖查询。

但是如果查询是SELECT *,我应该包括所有列索引吗?我知道我这样做是在复制整个表格,这是好还是坏的做法?

索引大部分/整个表通常不是一个好主意,特别是当表有插入/更新/删除时。当索引中没有包含所有需要的字段时,必须使用聚集索引进行键查找,以从表中查找行。这是好还是坏取决于你要获取多少行,以及聚集索引中有多少层——这就是为什么使用窄的聚集键(最好是int)是好的。

如果你必须对表中重要部分的行进行键查找,那么扫描整个表通常要快得多。在您的场景中也很可能出现这种情况,因为如果没有多少行受到影响,那么进行键查找不会那么昂贵,因此对所有字段进行索引并没有真正的帮助。

当然,如果你的表很大,索引所有的列可能会有帮助,至少在理论上。我甚至从来没有考虑过这样做,但我认为,当扫描整个表是一个昂贵的操作时,它会有所帮助。当然,这只是在表没有得到太多更新的情况下,因为维护索引也会导致问题。

最新更新