indexing - 如果没有复合索引,Datomic 用户如何应对?

标签 indexing composite-key datomic

在 Datomic 中,您如何有效地执行诸如“查找所有居住在华盛顿 50 岁以上的人”(城市和年龄可能会有所不同)之类的查询?在关系数据库和大多数 NoSQL 数据库中,您为此使用复合索引;据我所知,Datomic 不支持这样的事情。

我构建了几个,比如说,中等规模的网络应用程序,如果不是复合索引,没有一个可以足够快地执行。 Datomic 用户如何处理这个问题?或者他们只是在玩足够小的数据集而不会受到这种影响?我错过了什么吗?

最佳答案

由于 Datomic 中数据(数据)的结构,此问题及其解决方案在 Datomic 中并不相同。有两个性能特征/策略可能会为此添加一些阴影:

(1) 当您在 Datomic 中获取数据时,您会从索引树中获取整个叶段(不是单个项目)——这些段可能由数千个数据组成。然后它会自动缓存,这样您就不必通过网络访问以获得更多数据。

如果您正在查询一个人 - 即单个实体,了解他们的年龄和居住地,则 EAVT 或 AEVT 索引的查询导航很可能已缓存了您需要的所有内容。您已经有效地缓存了数据、如何导航到它以及相关数据(按索引中的位置)。

(2) Partitions可以提供手动方式来指定引用位置。分区会影响实体 ID 的值(它以高位编码)并确保相关实体彼此靠近排序。因此,对于上述问题的另一种实现方式,如果您需要来自 city 和 person 实体的信息,您可以将它们包含在同一个分区中。

关于indexing - 如果没有复合索引,Datomic 用户如何应对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561429/

相关文章:

html - 从 url 中删除 index.html

Mysql Innodb : Combining 3 Tables Into Single Table for Quick Search. ..条件连接

Java Mapreduce group by compositekey 和排序

clojure - 如何更新/覆盖具有基数很多的 ref 属性?

clojure - 将Clojure Spec与Datomic实体一起使用

结合 MATCH...AGAINST 和 LIKE 作为备份的 MySQL 部分单词匹配

database - 为什么我有针对唯一索引的非唯一条目? (PostgreSQL 9.0)

python - 如何使用复合键查询 couchdb View ?

datomic - Datomic 引用关系的属性

java - 用于部分 %infix% 搜索的索引数据的数据结构是什么?