【问题标题】:ArangoDB - Is indexing better, than having more collections?ArangoDB - 索引比拥有更多集合更好吗?
【发布时间】:2020-06-08 10:28:39
【问题描述】:

我有 3 种类型的实体:

  • 主题
  • 主题
  • 任务

在每个主题中都有主题任务主题 可以相互依赖。 (当然,一个属于sj1 subjecttopic,只能依赖另一个同样属于sj1 subject的topic 。)

taskstopics 之间存在联系(也必须属于同一主题),这象征着我们要解决某个 task需要了解某些主题

所以一个任务可能需要更多主题。更多任务可能需要一个主题。 (NM 连接。)

存储的最佳解决方案是什么?

  1. 解决方案

    • 每种类型的实体有 3 个集合
    • taskstopics 中有一个主题标识符属性的索引。
    • 和一个边集合,用于存储主题 [N][M] 任务之间的连接
  2. 解决方案

    • 主题有 1 个集合
    • 对于每个 主题,有 1 个 topics 和 1 个 tasks 集合。 subjectstasks/topics 之间的连接可以基于集合名称的前缀。 (即对于 chemistry 主题,我们有 chemistry_taskschemistry_topics 合集)
    • 对于每个主题,都有一个用于任务主题之间连接的边集合和另一个用于主题之间连接的边集合(即chemistry_topics_tasks_connectionschemistry_topics_connections

    这样,如果我想在某个主题的主题或任务中进行搜索,我不需要根据主题标识符索引对其进行预过滤。我将立即获得包含我所有数据的所需集合。此外,对于 taskstopics 中的每个文档,我没有索引开销。 另一方面,这会导致集合混乱。


旁注:最多 50 个主题,但任务和主题的数量不受限制。

【问题讨论】:

    标签: database indexing collections arangodb


    【解决方案1】:

    用你的话来说,“意识”是通过“图表”产生的,它不需要额外的索引就可以发挥最佳效果。 ArangoDB 自动创建特殊的“_key”和“_from/_to”索引,用于图遍历。

    但就索引而言,这与所有搜索性能有关 - 索引是根据您要查找的数据添加的。这实际上取决于您要如何搜索:

    • 具有多种实体类型的集合或
    • 按实体类型分隔的多个集合。

    拥有大型集合不会受到惩罚,并且图表可以链接单个集合中的文档 - 它不需要将它们分开。此外,您可以拥有多个边缘集合和/或多个文档集合。这些概念对我们这些像我一样来自传统 RDBMS 的人提出了挑战——“无模式”或“多模型”数据库有点让规范化成为可能。

    就个人而言,我选择基于数据源构建相当大的集合(我从外部源导入数据)。每个集合包含由objType 属性标识的多个对象/数据模式的文档。这里的好处是您可以在单个字段上搜索集合中的所有文档(甚至是具有多个字段的索引,例如title + objType),非常快速地减少文档集以迭代/遍历 - 通常是真正获得性能提升的地方。

    所以...我想我推荐解决方案#3

    【讨论】:

    • “拥有大量集合不会受到惩罚” - 据我所知,惩罚来自这样一个事实,即如果您在属性上使用索引,那么插入到集合也会在“索引集合/表”中生成一条记录。 (如果文档缺少特定属性,则跳过列表索引除外。)使用第二种解决方案可以避免这种情况,即使我们仍然能够使用该方法按主题搜索。基本上问题是,我会因为创建 200 个集合而受到惩罚吗?
    • @Woster - 是的,索引创建(或由于插入/删除而导致的修改)只是一个问题,但前提是您的集合正在经历大量修改。我的系统(一个在 OK-ish 硬件上运行的 4-CPU VM,没什么特别的)用不到 10 秒的时间来索引 500K 记录(有 7 个哈希索引)。您可能会在使用对索引字段(超过 50% 的记录)进行主要修改的 ETL 脚本时遇到问题,但也许截断并重新加载或“收集交换”会是一个更好的计划。
    • @Woster - 不,你不应该因为拥有 200 个集合而受到惩罚,除了加入/遍历边缘集合所需的时间。如果两个概念之间的边数相同(200 个集合或 1 个集合),那么在单服务器场景下遍历应该几乎没有性能差异(集群不同,本质上是不同的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多