2

目前,我们有一个用于跟踪邀请的表。我们有一个已编入索引的电子邮件字段,但我们还有三个可选键,用户可以在添加新记录电子邮件时指定它们。我们不允许重复,因此我们必须查询电子邮件和可选键是否已经存在。目前,如果指定了键,则仅将键添加到 select 语句中。正常情况是仅指定电子邮件并使用索引它工作得相当快。添加键时性能下降。

添加三个索引会影响其他操作的性能吗?密钥可能很少使用,我们不想影响这种情况下的性能。

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

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

  • 电子邮件,key1,key2,key3

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

也可以看看

完全重复的帖子

4

4 回答 4

3

我个人会推荐这种方法。

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

然后尝试另一条路线并重复。

这真的取决于你的数据。

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

于 2008-10-16T18:26:56.560 回答
2

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

如果你只放了三个索引,而且比较简单,那么你应该没有问题。

于 2008-10-16T18:25:01.353 回答
0

我可能是错的,但我相信如果你添加:

  • 电子邮件,key1,key2,key3

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

于 2008-10-16T18:30:36.163 回答
0

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

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

于 2008-10-18T08:27:25.537 回答