google-cloud-firestore - Datastore 模式下的 Firestore:枚举属性值的索引热点与差的索引?
问题描述
我遇到的症状表明,在查询许多其他实体共享的属性时,Datastore 模式下的 Cloud Firestore 可能会很慢。似乎这可能与效率低下的无索引查询(例如,我需要一个复合索引进行此搜索)或索引热点有关(尽管我只能找到建议反对单调递增值的文档,而不是少数枚举值) .
我的情况(简化)如下:
- 我有 1M 实体写入数据库(只有内置索引)
- 所有实体都具有以下属性:
prop1 = 'all'
- 所有实体都有一个独特的属性
id in ['000000' - '999999']
, 和另一个属性,id2=id
- 所有实体的 1/10(即 100k 实体)具有属性
first_dig = '0'
因此,有几种方法可以查询相同的实体(在云控制台中使用 GCL 或通过 Java API):
SELECT * FROM kind WHERE id = '000000'
SELECT * FROM kind WHERE id = '000000' AND first_dig = '0'
SELECT * FROM kind WHERE id = '000000' AND first_dig = '0' AND id2 = '000000'
SELECT * FROM kind WHERE id = '000000' AND first_dig = '0' AND prop1 = 'all'
我发现查询#1 需要 5 秒,#2 需要 15 秒,#3 需要 15 秒,#4 需要约 50 秒。#4 比 #2 慢得多,但 #3 并不比 #2 慢的事实让我认为在搜索时存在索引热点prop1='all'
(所有索引条目可能都在同一个平板电脑上),但对于id2='000000'
.
我的问题是:
- 是什么导致这里的放缓?有什么我错过的吗?
- 是否有推荐的做法来查询具有低唯一性的索引属性?
谢谢!
请注意,这是交叉发布到https://groups.google.com/forum/#!topic/google-appengine/91jCVQXZ6tI,但这似乎是一个更合适的地方。
解决方案
推荐阅读
- javascript - mochaJS:在 json 中迭代
- vba - 我可以将 Cells(Rows.Count, 1).End(xlUp).Row 存储在变量中吗?
- hive - 如何在插入分区集群事务表期间增加减速器的数量?
- android - 我正在使用的 AAR 中的 Firebase 实现导致我的应用程序崩溃
- javascript - 从反应方法中返回组件
- spring - Spring Boot 应用程序中的多个 RedisConnectionFactories
- c# - 指定的包含路径无效。EntityType 未使用继承集合中的名称声明导航属性
- node.js - 如何在没有错误的情况下为 node.js 安装 strongloop?
- javascript - 在javascript中复制到剪贴板不起作用
- c# - 在 C# MVC 中使用剑道 UI 网格层次结构的客户端模板时,剑道主自动增量 ID 显示在子网格中