不建议将计算从MySQL移动到PHP?

不建议将计算从MySQL移动到PHP?,php,mysql,Php,Mysql,我被我之前问过的问题所困扰——事实证明@MichaelT在一件事上是对的——使用PHP计算AVG比使用MySQL快(使用5m记录和24GB RAM机器计算AVG快80%) 它甚至不总是一个选项。但是,请考虑此代码示例(数据集大小为5M记录)。 MySQL方式。 1) 聚合数据(创建临时数据)(500ms) 2) 获取总体平均值(300ms) 3) 计算第95百分位(200ms) 4) 计算模式(200ms) PHP方式。 1) 将所有相关记录放入一个数组(200ms) 2) 执行所有计算(200

我被我之前问过的问题所困扰——事实证明@MichaelT在一件事上是对的——使用PHP计算AVG比使用MySQL快(使用5m记录和24GB RAM机器计算AVG快80%)

它甚至不总是一个选项。但是,请考虑此代码示例(数据集大小为5M记录)。 MySQL方式。

1) 聚合数据(创建临时数据)(500ms)

2) 获取总体平均值(300ms)

3) 计算第95百分位(200ms)

4) 计算模式(200ms)

PHP方式。

1) 将所有相关记录放入一个数组(200ms)

2) 执行所有计算(200ms)


PHP方法要快得多。有什么理由不应该使用PHP来执行这些计算吗?

将工作转移到PHP意味着必须通过网络传输整个结果集,这可能会非常糟糕,具体取决于大小。而且,我不是一个想入非非的数据库人,但这些结果是出乎意料的。您应该研究在数据库版本中是否有可能以错误的方式进行操作。

将工作转移到PHP意味着必须通过网络传输整个结果集,这可能非常糟糕,具体取决于大小。而且,我不是一个想入非非的数据库人,但这些结果是出乎意料的。在数据库版本中,您应该检查是否有可能以错误的方式进行操作。

速度不是一切。我会把它放在属于它的地方

它会在PHP中扩展吗? 同样使用PHP方法,您必须将所有数据从db传输到PHP。它需要多少内存,等等。 也许你的数据库没有得到很好的优化。数据库的磁盘可能已损坏,等等。
说真的,我会把它放在数据库里,看看它为什么表现这么差。

速度不是一切。我会把它放在属于它的地方

它会在PHP中扩展吗? 同样使用PHP方法,您必须将所有数据从db传输到PHP。它需要多少内存,等等。 也许你的数据库没有得到很好的优化。数据库的磁盘可能已损坏,等等。
说真的,我会把它放在数据库里,看看它为什么表现得这么差。

要扩展这个答案,这是不好的,因为如果大小增加,它将需要更多的时间。另外,我相信你在当地环境中测试得到的时间安排。如果数据库服务器位于另一台计算机中,数据增长的时间每次都会变慢。您可以正确猜测数据库服务器位于同一台计算机上。虽然,我不太担心横向扩张,因此这不是一个问题。老实说,我不太明白为什么后一种方法比后一种更好,毕竟,在这两种情况下,计算都是在内存中完成的,而不是在磁盘上。(在这个操作中根本不涉及磁盘,考虑这是一个内存表)来扩展这个答案,这是不好的,因为如果大小增加,它将花费更多的时间。另外,我相信你在当地环境中测试得到的时间安排。如果数据库服务器位于另一台计算机中,数据增长的时间每次都会变慢。您可以正确猜测数据库服务器位于同一台计算机上。虽然,我不太担心横向扩张,因此这不是一个问题。老实说,我不太明白为什么后一种方法比后一种更好,毕竟,在这两种情况下,计算都是在内存中完成的,而不是在磁盘上。(磁盘在这个操作中根本不涉及,认为这是一个内存表)
CREATE TEMPORARY TABLE `temporary_grouped_data` AS
(
    SELECT
        `r1`.`id`,
        `c1`.`wt`,
        `c1`.`cpu`,
        `c1`.`mu`,
        `c1`.`pmu`
    FROM
        `requests` `r1`
    INNER JOIN
        `request_hosts` `rh1`
    ON
        `rh1`.`id` = `r1`.`request_host_id`
    INNER JOIN
        `request_uris` `ru1`
    ON
        `ru1`.`id` = `r1`.`request_uri_id`
    INNER JOIN
        `calls` `c1`
    ON
        `c1`.`id` = `r1`.`request_caller_id`
    WHERE
        1=1 {$sql_query['where']}
);
SELECT COUNT(`id`), MIN(`wt`), MAX(`wt`), AVG(`wt`), MIN(`cpu`), MAX(`cpu`), AVG(`cpu`), MIN(`mu`), MAX(`mu`), AVG(`mu`), MIN(`pmu`), MAX(`pmu`), AVG(`pmu`) FROM `temporary_grouped_data`;
SELECT `wt` FROM `temporary_grouped_data` ORDER BY `wt` ASC LIMIT 1726, 1;
SELECT `cpu` FROM `temporary_grouped_data` ORDER BY `cpu` ASC LIMIT 1726, 1;
SELECT `mu` FROM `temporary_grouped_data` ORDER BY `mu` ASC LIMIT 1726, 1;
SELECT `pmu` FROM `temporary_grouped_data` ORDER BY `pmu` ASC LIMIT 1726, 1;
SELECT `wt`, COUNT(`wt`) `quantity` FROM `temporary_grouped_data` GROUP BY `wt` ORDER BY `quantity` DESC LIMIT 1;
SELECT `cpu`, COUNT(`cpu`) `quantity` FROM `temporary_grouped_data` GROUP BY `cpu` ORDER BY `quantity` DESC LIMIT 1;
SELECT `mu`, COUNT(`mu`) `quantity` FROM `temporary_grouped_data` GROUP BY `mu` ORDER BY `quantity` DESC LIMIT 1;
SELECT `pmu`, COUNT(`pmu`) `quantity` FROM `temporary_grouped_data` GROUP BY `pmu` ORDER BY `quantity` DESC LIMIT 1
SELECT
    `r1`.`id`,
    `c1`.`wt`,
    `c1`.`cpu`,
    `c1`.`mu`,
    `c1`.`pmu`
FROM
    `requests` `r1`
INNER JOIN
    `request_hosts` `rh1`
ON
    `rh1`.`id` = `r1`.`request_host_id`
INNER JOIN
    `request_uris` `ru1`
ON
    `ru1`.`id` = `r1`.`request_uri_id`
INNER JOIN
    `calls` `c1`
ON
    `c1`.`id` = `r1`.`request_caller_id`