我正在使用 MERN 堆栈构建一个领先数据网站。用户可以根据国家、城市、职位、资历、行业、部门、电子邮件类型等各种标准过滤数据(总共超过 10 个过滤选项)。他们可以选择任何字段或字段组合来过滤数据。我已将每个请求设置为 25 条记录的限制,以保持响应的可管理性。
目前,我已经对所有字段(国家、城市、职称等)单独建立了索引,当使用单个过滤器时,数据检索快速高效。然而,当用户应用多个过滤器时,性能会显着下降——要么数据没有被正确过滤,要么结果需要很长时间才能加载。
我尝试了复合索引,这提高了特定过滤器组合的性能。但是,由于用户可以以任何随机组合应用过滤器,因此我正在努力找出优化所有潜在过滤器组合的查询性能的最佳方法。
这是我的过滤后端代码
if (Array.isArray(filters.countries)) {
addCondition(
"_source.person_location_country",
"$in",
filters.countries
);
}
if (Array.isArray(excludedFilters.countries)) {
addExclusionCondition(
"_source.person_location_country",
"$nin",
excludedFilters.countries
);
}
// job title
if (Array.isArray(filters.jobTitle)) {
addCondition("_source.person_title", "$in", filters.jobTitle);
}
if (Array.isArray(excludedFilters.jobTitle)) {
addExclusionCondition(
"_source.person_title",
"$nin",
excludedFilters.jobTitle
);
}
// seniority
if (Array.isArray(filters.seniority)) {
addCondition(
"_source.person_seniority",
"$in",
filters.seniority.map((s) => s.toLowerCase())
);
}
if (Array.isArray(excludedFilters.seniority)) {
addExclusionCondition(
"_source.person_seniority",
"$nin",
excludedFilters.seniority.map((s) => s.toLowerCase())
);
}
// Apply all conditions
if (conditions.length > 0) {
query.$and = conditions;
}
if (exclusionConditions.length > 0) {
query.$and = [...(query.$and || []), ...exclusionConditions];
}
results = await Contacts_V5.find({
_id: { $in: savedItemsIds },
...query,
})
.skip((page - 1) * limit)
.limit(limit)
.exec();
res.status(200).json({
results
});
我的问题是:
在此场景中任何有关索引和优化查询性能的建议或最佳实践将不胜感激!
由于用户可以随机组合应用多个过滤器,因此单个复合索引是不够的。您可以尝试根据最常用的过滤器组合动态生成复合索引。这样您就可以生成您确信用户经常使用的复合索引。