在MySQL端或PHP端处理这个查询是否更好?

时间:2016-06-17 01:00:14

标签: php mysql performance

说明:

为闭源PHP程序编写扩展, 我需要根据这些示例查询添加一些数字

SELECT sum(value) AS sum1 FROM table WHERE user_id=X AND text='TEXT_HERE_A'
SELECT sum(value) AS sum2 FROM table WHERE user_id=X AND text='TEXT_HERE_B'

在PHP中添加这些数字,然后在数据库中更新字段

$update = $sum1 + $sum2 - $php_sum;
UPDATE table SET value=$update WHERE user_id=X

问题:

正如您所见,我正在根据" text"进行搜索。 MySql中的数据类型,

你觉得这个动作还可以吗?或者我应该做以下事情:

SELECT value,text FROM table WHERE user_id=X

然后通过循环在PHP端进行求和和计算(这里的区别仅在于我基于user_id KEY(INT)选择,并且计算的总和是PHP端)

哪一个在大表中有更好的表现?

  

问题:在这种情况下哪一个更好?在PHP端或MySQL端计算SUM?

2 个答案:

答案 0 :(得分:1)

返回大量行并在客户端进行过滤和求和通常是错误的 - 您通常希望最大限度地减少客户端和服务器之间传输的数据量。因此,如果您可以使用WHERE子句进行过滤,并使用SUMCOUNT之类的内容进行汇总,那么通常更可取。

我会尝试在服务器上完成整个事情。

UPDATE table AS t1
JOIN (SELECT SUM(value) AS total_value
      FROM table
      WHERE user_id = X AND text in ('TEXT_HERE_A', 'TEXT_HERE_B')) AS t2
SET value = total_value - $php_sum 
WHERE user_id = X

答案 1 :(得分:0)

如果您不需要PHP端代码的值,那么只需在一个查询中执行整个操作。

由于您的示例中有多个查询,因此您的代码容易出现并发异常 - 交错执行会使UPDATE语句的最终值不一致。

由于您的问题还询问了TEXT类型查询,因此它实际上取决于您在TEXT列中添加的数据类型。如果您可以使用CHARVARCHAR代替并在该列上添加索引,则查询会更快。 TEXT无索引搜索需要相当长的时间,索引TEXT列的代价很高。