php - 将计算从 MySQL 转移到 PHP 是不可取的吗?

标签 php mysql

我被我之前问过的问题困住了 – How to optimise a table for AVG query?事实证明,@MichaelT 在一件事上是正确的——使用 PHP 计算 AVG 比使用 MySQL 更快(例如使用 5m 记录和 24 GB RAM 机器快 80%)。

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

MySQL 方式。

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

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']}
);

2) 获取整体 AVG (300ms)

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`;

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

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;

4)计算模式(200ms)

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

PHP 方式。

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

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`

2) 执行所有计算(200 毫秒)。

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

最佳答案

将工作转移到 PHP 意味着必须通过网络传输整个结果集,这可能非常糟糕,具体取决于大小。另外,无论如何我都不是数据库专家,但这些结果是出乎意料的。您应该调查您在数据库版本中以错误的方式做事的可能性。

关于php - 将计算从 MySQL 转移到 PHP 是不可取的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514268/

相关文章:

php - 查询为空,还有其他错误

php - 如何将这个内连接 mysql 查询转换为 Laravel 的 Fluent 查询?

php - 密码散列在 php mysql 中不起作用

php - DataTables 1.9.4 - 限制结果

mysql - Mysql函数耗时太长

mysql - MySQL 中的长文本类型字段中是否存储任何类型(整数、文本、日期)?

php - 如何在 Angular 和 PHP 中对某些用户隐藏页面

php - file_get_contents 和 fread 有什么区别

php - 对于实时应用程序,MongoDB + Socket.io 是否优于 MySQL + Socket.io?

javascript - Google 时间轴图表 - 将无持续时间的事件更改为圆圈