2012-12-26 28 views

回答

12

需要考虑的另一个要点是:复合索引(由多列组成)只会在n个最左列被引用时才会使用(例如,在WHERE条款)

所以,如果你有一个单一的化合物索引

(UserID, UserName, UserEmail) 

那么这个指数可能在下列情况下使用:

  • ,当你独自寻找UserID(仅使用1最左边的列 - UserID
  • 当你搜索UserIDUserName(使用最左边的2列)
  • 当您搜索所有三列时

但这种单一的化合物指数将永远能够被用于搜索上

  • 只是UserName - 这是在索引的第二列,因此该指数不能永远是
  • 只是用UserEmail - 这是该指数第三列,因此该指数不能曾经使用

菊st记住这一点 - 仅仅是因为列是索引的一部分并不一定意味着只有那一列的搜索才会被该索引支持并加速!

所以,如果您的使用模式和应用程序真的需要UserName和/或UserEmail单独搜索(不提供其它搜索值),那么你必须这些列上创建单独的指数 - 只是一个单一的化合物中的一个会不是有任何好处。

4

定义索引的最好方法完全取决于你如何使用表格。仅仅通过查看表定义就没有明智的选择索引的方法。

如果您的代码使用用户名搜索您的表或通过用户名将表与另一个表连接起来,那么定义该列上的索引将是明智之举。如果您的代码使用两列(用户名和用户邮件)与另一个表加入表,那么为这两列定义索引将是明智之举。由于所有的列都被定义为唯一的,我不相信这会是这种情况,因此您不需要在该表上使用多个列索引。

使用多列索引时可能会有一些额外的建议:多列索引也用于部分适合索引但具有条件的过滤器。
示例: 如果您在用户名和用户邮箱(按给定顺序)上定义了双列索引,则在通过两列(用户名和用户邮箱)进行过滤的搜索中,性能会有所提高。使用该索引,您还将在仅使用用户名的过滤器中获得性能提升,因为这是索引的第一列,但不在通过用户邮件进行的搜索中,这是因为索引的第二列不能单独使用。
规则是:索引可用于使用完全匹配的列进行过滤或使用与索引定义中后续顶部列匹配的列子集进行过滤。

2

请分享你的想法,为什么比其他更可取。

这取决于你做什么。

请参阅索引仅用于“从左到右”。所以,一个用户ID的indes;如果我选择仅由用户名筛选,UserName是无用的。

一般来说,我会假设这里三个指标:

  • Uniuqe指数,在用户名集群,作为主键。
  • UserName上的唯一索引,非群集。
  • UserEMail上的唯一索引,非群集。

的原因是完全不适合的性能,但是:

  • ,您将需要第一个为forein键关系的主键。
  • 您需要其他两个来正确处理唯一约束 - 没有索引就没有办法做到这一点。

此外,您需要灵活性来查找用户名和用户电子邮件,这意味着它是不可能的只有它们合并。

性能真的进入了最后 - 因为性能原因所有这些索引可能包含所有附加字段(不是作为索引的一部分,而是作为包含的列)但实际上,没有其他明智的方式来使此表工作,除非

相关问题