php - 提高 MongoDB 聚合管道性能

标签 php linux mongodb performance aggregation-framework

我正在使用 MongoDB 聚合管道来生成报告。下面是一些快速的关键信息:

Machine: 8-Core-CPU, 16 GB RAM
OS: Ubuntu 16.04.1 LTS

MongoDB Version: 3.2.11
Mongo PHP Adapter: 1.6.14
PHP Version: 5.6.30

Amount of documents to aggregate: ~ 10+ million

我的聚合管道代码 - 我用 PHP 编写和执行 - 如下所示:

// create indexes (ASC and DESC for each aggregation key)
$mongoCollection->createIndex('foo' => 1);
$mongoCollection->createIndex('foo' => -1);
$mongoCollection->createIndex('bar' => 1);
$mongoCollection->createIndex('bar' => -1);

// prepare aggregation (1. group, 2. sort)
$aggregationPipeline = [
    [
        '$group' => [
            '_id' => [
                '$foo' => 'foo',
                '$bar' => 'bar'
            ],
            'count' => [
                '$sum' => 1
            ]
        ]
    ],
    [
        '$sort' => [
            'count' => -1
        ]
    ]
];


// run aggregation
$mongoCollection->aggregate($aggregationPipeline);

问题是,聚合速度不够快!根据我聚合的字段数量(在我的示例中只有 2 个),该过程大约需要 90 秒,通常更长。

我的目标是: 提高聚合的性能!

我的问题:

  1. PHP
  • 如前所述,我使用 PHP 来控制和运行我的聚合。
  • => 使用 PHP-Mongo-Classes 和 -Methods 从 PHP 运行聚合是不好的做法吗?
  • => 升级到 PHP 7.x 会提高 Mongo 聚合性能吗?
  1. 索引
  • 我有一种主观感觉,即添加 DESC 和 ASC 索引(参见示例代码)并没有提高性能。无论是否添加索引,运行时间似乎几乎相同。
  • => 是否有可能添加索引不会显着提高性能?
  1. CPU 核心数
  • 当聚合运行时,我可以观察到,只有一个 CPU 核心被使用。
  • => 如何管理/实现聚合管道同时使用所有 CPU 核心?
  1. 分片
  • 我了解了 MongoDB 分片,这可能是提高 Mongo 整体性能的另一种可能方法。
  • => 在单台机器上设置/配置分片是否可能并且有意义吗?

非常感谢您提出任何意见、建议、批评和问题!

最佳答案

  1. PHP

没有线索,但我想它在这里起的作用很小。 foo 和 bar 的基数 - 聚合返回的文档/字节数也可能有影响。

  1. 索引

首先,对一个字段同时使用升序索引和降序索引是没有意义的。其次,索引可用于 $match 聚合管道,但在涉及 $group 操作时无用。所以你的想法是对的,索引在这里帮不了你。您正在进行全面扫描。

  1. CPU 核心数

您不能并行运行聚合操作。您可以通过从外部控制聚合,通过将其分解为子任务来在技术上实现它。但由于您正在进行全面扫描 - 再次 - 这对您的情况不利。

  1. 分片

在同一台机器上拥有多个分片,竞争相同的硬件是没有意义的。您可以通过使用更多硬件来添加分片。

这里的资源非常有限,只有 16 GB RAM 和 100 M 文档。这可能还不够,特别是如果您的文档不是很小并且您必须转到磁盘才能处理更多文档。我会检查聚合期间的 IO 利用率,以及 WiredTiger 缓存的行为方式(假设您使用的是 WiredTiger)。

综上所述,这可能是您的资源有限。客户端/驱动程序对缓慢的影响可能很小。首先对聚合运行 explain(),同时观察 RAM、磁盘的行为。

关于php - 提高 MongoDB 聚合管道性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41986251/

相关文章:

php - 显示来自数据库的不同数据

mongodb - Scala MongoDB : result of query as list

javascript - 插入失败 : Method in meteor 1. 3 并使用react

mongodb - 如何在Orbeon中添加MongoDB数据源

PHP XML : Illegal Offset, 但它在数组中?

php - 从 mysql PHP 获取行时出错

php - 数据库插入不起作用并且没有给出任何错误

linux - 启动 Sublime Text 的快捷命令 "ed"

linux - 使用 cygwin 运行 "./"bash/批处理文件

linux - 脚本从上次运行中获取参数