好多了; mysql调度程序或php脚本和crontab?

时间:2018-06-18 19:50:27

标签: php mysql

我有1个mysql表,其中有数千行。我将其用作用户的交易历史记录。我还在同一页面上查询此表格,了解每种产品的收益总和。这是我的两个mysql调用;

$earnperproduct = mysqli_query($con,"SELECT product, SUM(amount) AS totalearn FROM wp_payout_history WHERE user=$userid GROUP BY product");
$result = mysqli_query($con,"SELECT * FROM wp_payout_history WHERE user=$userid ORDER BY date DESC");

我担心随着桌面的增长,$earnperproduct调用将变得过于密集并且减慢页面加载速度。因此,不是每次页面加载时都执行sum命令,我认为只要更改wp_summary_table以使用新wp_payout_history替换过去的值,就更容易更新摘要(例如SUM(AMOUNT))每个用户和产品的价值;因此查询这样的东西;

$earnperproduct = mysqli_query($con,"SELECT * FROM wp_payout_summary_table WHERE user=$userid ORDER BY product DESC");

TL; DR 使用$earnedperproduct样式调用更新表的最佳方法是什么?我会更好地使用mysql事件调度程序或带有crontab的php脚本吗?是否有任何教程可以帮助我创建满足我需求的选项?

1 个答案:

答案 0 :(得分:1)

您提到的控制机制都使用时间作为操作的触发器。但是您的描述表明您确实希望在数据发生变化时触发操作。在关系数据库中,更改数据时触发操作的最佳方法是使用.... trigger。这使您的问题成为duplicate of this

可以说可能更有效地对事务进行快照,然后就像....

 [INSERT INTO summary_table (user, total_amount, last_id) ]
 SELECT 
   user, SUM(amount), MAX(id)
 FROM (
    SELECT a.user, a.total_amount AS amount, a.last_id
    FROM summary_table a
    WHERE a.user=$user_id
    AND last_id=(SELECT MAX(b.last_id)
       FROM summary_table b
       WHERE b.user=$user_id) 
    UNION
    SELECT h.user, h.amount, h.id
    FROM wp_payout_history h
    WHERE h.user=$user_id
    AND h.id>(SELECT MAX(c.last_id)
       FROM summary_table c
       WHERE c.user=$user_id)
 ) ilv
 GROUP BY user;

...然后,您使用什么来刷新历史记录并不重要 - 查询将始终为您提供最新的响应。如果沿着这条路线走,那么在摘要表中添加一个虚拟整数列,并将0 as unaggregatedrows添加到第二个SELECT,并将SUM(1)添加到第四个SELECT,以确定何时最有效地更新摘要表