我有 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_payout_history
时更新摘要(示例wp_summary_table
(以将过去的值替换为每个用户和产品的新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 脚本会更好吗?是否有任何教程可以帮助我根据需要创建任一选项?
您提到的两种控制机制都使用时间作为操作的触发器。但是您的描述表明您确实希望在数据更改时触发操作。在关系数据库中,在数据更改时触发操作的最佳方法是使用 ....触发。这使您的问题与此重复。
可以说,快照交易可能更有效,然后是这样的......
[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)
添加到第 4 个 SELECT,以确定何时更新汇总表最有效。