php - 用 php 更新数以千计的 mysql 行

标签 php mysql mysqli

我有一个脚本需要每晚更新一个值。

我的 mysql 数据库有 119k 行,被分组为 35k 行。

对于这些行中的每一行,我需要计算最高值和最低值,并使用这些行之间的新百分比差异更新行。

现在我什至无法执行限制为 50+ 的更新

我的代码:

$query_updates = mysqli_query($con,"SELECT partner FROM trolls WHERE GROUP BY partner LIMIT 0, 50") 
    or die(mysqli_error($con));

    while($item = mysqli_fetch_assoc($query_updates)) {

        $query_updates_prices = mysqli_query($con,"SELECT 
                                                        MIN(partner1) AS p1, 
                                                        MAX(partner2) AS p2, 
                                                        COUNT(partner3) AS p3 
        FROM trolls WHERE partner='". $item["partner"] ."'") 
        or die(mysqli_error($con));

        $partner = mysqli_fetch_assoc($query_updates_prices);
        $partner1 = $partner["p1"];
        $partner2 = $partner["p2"];
        $difference = $partner1 - $partner2;
        $savings = round($difference / $partner1 * 100);

        $partner3 = $prices["p3"];

        $update_tyre = mysqli_query($con, "UPDATE trolls SET 
                                                                        partner1='". $partner1 ."', 
                                                                        partner2='". $partner2 ."', 
                                                                        partner3='". $partner3 ."', 
                                                                        partner4='". $savings ."' 

        WHERE partner='". $item["partner"] ."'") 
        or die(mysqli_error($con));

        echo '<strong>Updated: '. $item["partner"] .'</strong><br>';

    }

我怎样才能使它更简单/更容易执行?

最佳答案

+1 用于 cron,命令行运行也可以帮助您解决问题,因为它不会超时。但是,您可能会遇到通过锁定表进​​行分组的问题。 老实说(你不会喜欢这样)但是如果你在一个有大量字段的字段上进行分组,那么我会说你做错了什么。 因此,我会考虑重新制作表格,为“合作伙伴”准备一张表格,然后引用会有所帮助的巨魔。

但是为了给你一个解决方案来加快这个速度,让你转向更好的数据库/表设置并消除锁定问题。我会这样做。

第一步。 创建一个名为

的表
Partners
Field1: partner_id
Field2: partner
Field3: p1
Field4: p2
Field5: p3

第 2 步: 运行查询 SELECT partner FROM trolls(将来可能会更改为 SELECT * FROM partners)

第 3 步: 检查他们是否在合作伙伴中 - 如果不插入

第 4 步: 运行你的

SELECT 
MIN(partner1) AS p1, 
MAX(partner2) AS p2, 
COUNT(partner3) AS p3 
FROM trolls WHERE partner='". $item["partner"] ."'

第 5 步: 将此值更新到 Partners 表中,并(暂时)更新 trolls 表。

完成。

哦,如果它还不存在,请在合作伙伴字段中添加一个索引。

关于php - 用 php 更新数以千计的 mysql 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857411/

相关文章:

php - 文件被临时上传到/root/tmp 而不是/tmp

php - Android中jSONArray解析异常的问题

php - 如何在 yii2 queryParams 中设置 OR 条件?

php - MySQL/PHP 搜索效率

MySQL varchar(2000)与文本?

php - Mysqli 准备语句插入不插入

php - 在php中显示表中的数据

php - 将文本框值存储在 php 数组中

php - 从 zip 存档中创建和提取文件

PHP/MySQL : 2 selects from same table in one query