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

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

  • 电子邮件,密钥1
  • 电子邮件、密钥 1、密钥 2
  • 电子邮件、密钥 1、密钥 2、密钥 3

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

  • 电子邮件、密钥 1、密钥 2、密钥 3

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

也可以看看

完全重复的帖子

有帮助吗?

解决方案

我个人会推荐这种方法。

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

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

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

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

其他提示

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

如果你只放三个索引,而且它们相对简单,那么你应该不会有问题。

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

  • 电子邮件、密钥 1、密钥 2、密钥 3

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top