azure - CosmosDb Mongo - 使用 shardkey 收集,通过 shardkey 缓慢查询?
问题描述
我有一个带有 Mongodb 的 CosmosDb 集合。这是一个客户数据库,ShardKey 实际上是 CustomerId。我的收藏有 200000 条记录,并且有电子邮件和客户 ID 的组合索引。
一个客户的例子:
{
"CustomerId" : "6a0f4360-d722-4926-9751-9c7fe6a97cb3",
"FirstName" : "This is my company first name",
"LastName" : "This is my company last name",
"Email" : "6a0f4360-d722-4926-9751-9c7fe6a97cb3@somemail.com",
"Addresses" : [
{
"AddressId" : "54e34da9-55fb-4d60-8411-107985c7382e",
"Door" : "11111",
"Floor" : "99",
"Side" : "B",
"ZipCode" : "8888",
}
]
}
我觉得奇怪的是,如果我通过电子邮件查询它会花费 7000 RUs(这太多了 - 至少数据浏览器告诉我...)但是如果我通过 CustomerId 查询,它花费或多或少相同的 RUs...
我的问题是:
- 两个操作不应该花费比这更少的 RU,特别是 CustomerId?
通过电子邮件查询的示例:
{ "Email" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab@somemail.com" } }
CustomerId 的查询示例:
{ "CustomerId" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab" } }
另一个问题,我的索引包含 Email 和 CustomerId。例如,我有什么方法可以通过电子邮件查询并仅返回 CustomerId?
解决方案
两个操作不应该花费比这更少的 RU,特别是 CustomerId?
CustomerId
是您的分片键(又名分区键),它有助于将具有相同 CustomerId 值的文档分组以存储在同一逻辑分区中。此分组在对 Cosmos 的精确 GET/SET 调用期间使用,但在查询期间不使用。所以,你需要一个CustomerId
明确的索引。
此外,由于您拥有的索引是 and 上的复合索引CustomerId
,因此Email
一次仅对其中一个字段进行查询将导致执行扫描以获取结果。因此,每个查询的 RU 费用都很高,而且 RU 费用也差不多。
另一个问题,我的索引包含 Email 和 CustomerId。例如,我有什么方法可以通过电子邮件查询并仅返回 CustomerId?
首先,为了在 上进行最佳查询Email
,您需要Email
单独创建一个索引。此后,您可以使用project
Mongo 的功能在响应中仅包含某些字段。
像这样的东西-
find({ "Email" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab@somemail.com" } }, { "CustomerId":1 })
推荐阅读
- sql - 包含 TOP 1 的 SQL 命令具有无限的加载时间
- shell - 如何使这个循环递归?
- reactjs - 在将 JSX 文件处理到 babel watch-task 之前连接它们
- java - Java argparse4j 如何验证参数
- swift - SwiftUI - @AppStorage 变量键值
- docker - phpmyadmin:fpm-alpine Docker 图像渲染问题与 Nginx 和 Docker-Compose
- amazon-web-services - 如何在亚马逊连接中将 lex 插槽设置为联系人属性?
- sql-server - 更新第二张表时,一张表可以拥有排他锁吗?
- html - 使用带有断字的省略号时文本跨度上的空白空格
- reactjs - 如何模仿键盘交互的手势?(焦点+空格键按下)