我有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脚本吗?是否有任何教程可以帮助我创建满足我需求的选项?
答案 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,以确定何时最有效地更新摘要表