Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每周更新MYSQL字段的最佳方法?_Mysql_Architecture_Average - Fatal编程技术网

每周更新MYSQL字段的最佳方法?

每周更新MYSQL字段的最佳方法?,mysql,architecture,average,Mysql,Architecture,Average,我想每周更新MySQL表“Persons”中的一个字段,使用“Tasks”表的两个字段的平均值,即end_date和start_date: PERSON: +----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-------------+------+-----

我想每周更新MySQL表“Persons”中的一个字段,使用“Tasks”表的两个字段的平均值,即end_date和start_date:

PERSON:
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| average_speed  | int(11)     | NO   |     | 0       |       |
+----------------+-------------+------+-----+---------+-------+

TASKS:
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| person_id      | int(11)     | NO   |     | NULL    |       |
| start_date     | date        | NO   |     | NULL    |       |
| end_date       | date        | NO   |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
(表格不完整)

平均速度=平均值(task.end\u日期-task.start\u日期)

现在,任务表非常大,**我不想计算每个人每周完成的每个任务的平均值**。(这是一个解决方案,但我正在努力避免它)

更新平均速度的最佳方法是什么? 我考虑在person表中添加两列:

  • “last_count”:从现在起每个人的计算任务数
  • “最后金额”:每个人的最后金额(结束日期-开始日期)
因此,在一个新的更新中,我可以做一些类似于average_speed=(last_sum+new_sum)/(last_count+new_count)的事情,其中new_count是上周任务的总和

有更好的解决方案/架构吗?

编辑: 为了回答评论,我会这样做:

SELECT 
    count(t.id) as last_count,
    sum(TIMESTAMPDIFF(MINUTE, t.start_date, t.end_date)) as last_sum
    avg(TIMESTAMPDIFF(MINUTE, t.start_date, t.end_date))
from tasks as t
where t.end_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 WEEK) AND CURDATE()

我可以依靠一个php脚本来获得结果并进行一些计算

由于上面列出的所有原因以及其他原因,定期更新表是一种不好的方式

如果您可以访问写入Tasks表的代码,那么这是放置更新的最佳位置。添加一个平均值字段,并在写入任务结束时间时计算和设置该值

如果您没有访问代码的权限,可以向表中添加一个计算字段来显示平均值,并让SQL在执行查询时计算出来。这可以稍微降低查询速度,但数据总是有效的,SQL足够聪明,只在需要时计算该值


第三个(丑陋)选项是表上的触发器,在适当时更新值。我不喜欢触发器,因为触发器会将业务逻辑隐藏在意外的地方,但有时您只需要完成工作。

您有针对该问题的示例查询吗?您有错误吗?最好的方法可能是根本不存储它,但问题是tasks表有近100万行,总数据量超过7GB,因此每次需要计算(考虑到所有任务)都非常慢。这是一个每天会被激发100次的查询。@Jervz09不,没有错误,但我真的不喜欢我的解决方案,我正在寻找更好的解决方案,一些建议谢谢你的回答,你一直都是对的,但我能做的事情非常有限。我会考虑你的第一个选择。但是坚持我试图解释的这个丑陋的更新,你认为有更好的解决方案吗?如果你必须做那个更新,那么就没有更好的方法了。如果您有权访问数据库,则可以创建一个单独的汇总表,并将值保留在其中。然后您只需在摘要表中插入“where{id}不在{main table}”即可。那应该更快。