在复合索引上使用多值 eqJoin 的 Rethinkdb 性能

Rethinkdb Performance with multi-value eqJoin on compound index

更新:再看一遍,我想我只需要对数据进行更多的非规范化,然后简单地将相关位置信息 (city/state/etc.) 添加到推荐的每一行 table,而不是对一大组邮政编码进行连接。我在正确的轨道上吗?

原问题:

我有两个 table,一个包含邮政编码信息,另一个 table 包含大约 400 万行,每行都有一个邮政编码和一些其他信息。给定一个特定的邮政编码,我想获得相同状态 and/or 城市中的所有邮政编码(在下面的示例中只是状态),然后从推荐 table 中提取所有匹配那些的行来自系统其他部分的 ZIP 和一些其他类别数据。

我正在使用下面的查询,它有效,但需要大约 10 秒才能到达 运行。

r.table('all_geocodes').getAll('77019',
            {index:'postal_code'}).pluck('state_name')
  .eqJoin(r.row('state_name'), r.table('all_geocodes'),
      {index: 'state_name'}).zip().pluck('location_id').distinct()

.eqJoin(function(v) { 
         return [v('location_id'), '207P00000X', 1]; 
   }, 
   r.table('fact_referrals_aggregates'),
     {index: 'location_and_taxonomy_and_entity_type_code'})
.zip().count()

一些相关的数字:

正如您从下面的查询分析器输出中看到的那样,ReDB 正在插入一个占用所有时间的 concatmap。这是我第一天使用 RethinkDB,所以我确定我缺少某些东西,但不知道它是什么。关于如何提高此查询性能的任何建议?是否可以通过不同的结构来避免 concatMap?

    {
    "description": "Evaluating count.",
    "duration(ms)": 9428.348954,
    "sub_tasks": [
      {
        "description": "Evaluating zip.",
        "duration(ms)": 9394.828064,
        "sub_tasks": [
          {
            "description": "Evaluating eq_join.",
            "duration(ms)": 9198.099333,
            "sub_tasks": [
              {
                "description": "Evaluating concatmap.",
                "duration(ms)": 9198.095406,
                "sub_tasks": [
                  {
                    "description": "Evaluating distinct.", // Distinct ZIP codes
                    "duration(ms)": 114.880663,
                    "sub_tasks": [
                      { *snipped for brevity* },
                      {
                        "description": "Evaluating elements in distinct.",
                        "mean_duration(ms)": 0.001039,
                        "n_samples": 2743
                      }
                    ]
                  },
                  {
                    "description": "Evaluating func.",
                    "duration(ms)": 0.004119,
                    "sub_tasks": []
                  },
                  {
                    "description": "Evaluating stream eagerly.",
                    "mean_duration(ms)": 1.0934,
                    "n_samples": 8285
                  }
                ]
              }
            ]
          },
          {
            "description": "Evaluating stream eagerly.",
            "mean_duration(ms)": 0.001005,
            "n_samples": 8285
          }
        ]
      }
    ]

非规范化最终成为了解决之道。我在推荐中添加了州和城市字段 table,消除了对 ZIP table 的大量连接,速度大大提高。