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

时间:2015-04-18 23:50:40

标签: rethinkdb

更新:再看一遍,我认为我只需要更多地对数据进行非规范化,只需将相关的位置信息(城市/州/等)添加到推荐表的每一行,而不是而不是在一大堆邮政编码上进行连接。我是在正确的轨道上吗?

原始问题:

我有两个表,一个包含邮政编码信息,一个推荐表包含大约400万行,每个表都有一个邮政编码和一些其他信息。给定一个特定的邮政编码,我想让所有的ZIP处于相同的州和/或城市(仅在下面的例子中说明),然后从推荐表中提取所有与这些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()

一些相关数字:

  • 查询的第一部分返回约2700个邮政编码。
  • 引用上的
  • getAll(['207P00000X', 1])返回大约100000行,并且与邮政编码进行内连接比我的速度慢得多。
  • 它还有大约100000行仅与邮政编码匹配。
  • 邮政编码和['207P00000X', 1]参数大约有8000行匹配。

从下面的查询分析器输出中可以看出,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
          }
        ]
      }
    ]

1 个答案:

答案 0 :(得分:2)

非规范化最终成为了这里的方式。我将状态和城市的字段添加到引用表中,消除了对ZIP表的大量连接,并且速度大大提高。