单个索引与多个字段索引

Posted

技术标签:

【中文标题】单个索引与多个字段索引【英文标题】:Individual indexes vs multiple field indexes 【发布时间】:2010-09-17 14:30:32 【问题描述】:

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

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

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

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

电子邮件、key1、key2、key3

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

另见

Exact duplicate post

【问题讨论】:

Multiple Indexes vs Multi-Column Indexes的可能重复 【参考方案1】:

我个人会推荐这种方法。

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

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

这真的取决于你的数据。

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

【讨论】:

这正是我会做的。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

电子邮件,key1,key2,key3

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于单个索引与多个字段索引的主要内容,如果未能解决你的问题,请参考以下文章

postgresql中多个列上的多个索引与单个索引

多个和单个索引

联合索引-以及如何使用索引

通过将单个查询图像与多个图像的列表匹配来存储关键点索引

20索引

MongoDB 一个复合索引与多个单字段索引