单个索引与多个字段索引

时间:2008-10-16 18:22:15

标签: sql indexing

目前,我们有一张表用于跟踪发件。我们有一个已编制索引的电子邮件字段,但我们还有三个可选密钥,用户在添加新记录电子邮件时可以指定这些密钥。我们不允许重复,因此我们必须查询电子邮件和可选密钥是否已存在。目前,如果指定了键,则仅将键添加到select语句中。正常情况下只指定了电子邮件,使用索引可以很快地运行。当键添加了性能下降。

添加三个索引是否会影响其他操作的性能?键可能很少使用,我们不希望影响这种情况下的性能。

  • 电子邮件,key1
  • 电子邮件,key1,key2
  • 电子邮件,key1,key2,key3

另一个想法是我们添加1个密钥。

  • 电子邮件,key1,key2,key3

然后总是在查找中使用所有3个键(例如,key1 = mykey,key2为NULL,key3为NULL)

另见

Exact duplicate post

4 个答案:

答案 0 :(得分:3)

我个人会推荐这种方法。

尝试使用涵盖所有内容的单个索引的方法,如果我没记错的话,如果只查询第一个包含的列,它仍然会表现良好。准备好索引后,运行Index Advisor。

然后尝试其他路线并重复。

这实际上取决于您的数据。

我通常能够使用1覆盖索引,首先从最常用的密钥开始。

答案 1 :(得分:2)

这取决于表的更新频率以及索引的复杂程度。如果您坚持创建索引,那么每次插入/更新/删除记录时,都必须修改每个索引以反映该信息。

如果您只打开三个索引,并且它们相对简单,那么您应该没有问题。

答案 2 :(得分:0)

我可能错了,但我相信如果你补充:

  • 电子邮件,key1,key2,key3

作为索引,如果您的查询使用“email”,“email / key1”,“email / key1 / key2”等,大多数数据库都会使用它,而不要求您为缺失值指定Null值字段。

答案 3 :(得分:0)

正如其他人所说,大多数数据库在搜索a,a和b或a,b和c时都会使用索引“a,b,c”。而且他们通常每个表只使用一个索引。因此添加“email,key1,key2,key3”可能是最好的。

那就是说,使用EXPLAIN来找出真正发生的事情。检查以确定您的查询使用的索引(如果有)。每个数据库都有它的怪癖。