首页 > 解决方案 > 如何使用 MySQL 和 PHP 优化多行的更新查询

问题描述

我有一张大约有 80.000 条记录的表。它有 4 列:

|   id   |  code  |  size |  qty |  
+--------+--------+-------+------+
|    1   |  4735  |   M   |   5  |
|    2   |  8452  |   L   |   2  |
    ...
| 81456  |  9145  |   XS  |   13 |

code列是唯一的。

我必须qty每天更新两次。

为此,我正在使用此查询:

UPDATE stock SET qty = CASE id 
                         WHEN 1 THEN 10
                         WHEN 2 THEN 8
                         ...
                         WHEN 2500 THEN 20
                       END
              WHERE id IN (1,2,...,2500);

我正在拆分查询以2500使用PHP.

这是(以秒为单位)每只2500股票更新所需的时间:

[0]7.11
[1]11.30
[2]19.86
[3]27.01
[4]36.25
[5]44.21
[6]51.44
[7]61.03
[8]71.53
[9]81.14
[10]89.12
[11]99.99
[12]111.46
[13]121.86
[14]131.19
[15]136.94
[END]137

如您所见,更新 2500 种产品需要 5 - 9 秒,我认为这很安静。

我可以改变什么来加快速度?

谢谢!

标签: mysql

解决方案


因为随着时间的推移,时间似乎越来越长,所以我希望您需要在 id 字段上建立一个索引,因为它看起来像是在进行全表扫描。您可以像这样创建索引

CREATE INDEX my_first_index ON table(id);

(我不得不添加这个作为答案,因为我不能发表评论,我知道这更像是评论!!)

** 编辑 **

我重新阅读并发现您的问题更大。我仍然认为在 id 上放置索引可能会修复它,但更好的解决方案是为 id 到数量映射创建一个新表,我们称之为 qty_mapping

|   id   |  qty |  
+--------+------+
|    1   |   10 |
|    2   |   8  |
    ...
| 2500   |   20 |

确保索引 id 然后您可以将更新更改为

update stock set qty = (select qm.qty from qty_mapping qm where qm.id = stock.id)

它应该能够立即更新全部 80,000 条记录。


推荐阅读