如何使用MySQL和PHP优化多行更新查询

如何使用MySQL和PHP优化多行更新查询,mysql,Mysql,我有一张大约有80000条记录的表。它有4列: | id | code | size | qty | +--------+--------+-------+------+ | 1 | 4735 | M | 5 | | 2 | 8452 | L | 2 | ... | 81456 | 9145 | XS | 13 | code列是唯一的 我必须每天更新两次数量 为此,我使用以下查询: UPDATE

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

|   id   |  code  |  size |  qty |  
+--------+--------+-------+------+
|    1   |  4735  |   M   |   5  |
|    2   |  8452  |   L   |   2  |
    ...
| 81456  |  9145  |   XS  |   13 |
code
列是唯一的

我必须每天更新两次
数量

为此,我使用以下查询:

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);
我正在使用
PHP
拆分查询,一次更新
2500
个股

以下是更新每个
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秒,我认为这很安静

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


谢谢大家!

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

CREATE INDEX my_first_index ON table(id);
(我不得不加上这个作为回答,因为我不能发表评论,我知道这更像是一个评论!!)

**编辑**

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

|   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)

它应该能够在很短的时间内更新整个80000条记录。

因为时间似乎越长,你越走越远,我希望你需要在id字段上建立一个索引,因为它看起来像是在做一个完整的表扫描。您可以像这样创建索引

CREATE INDEX my_first_index ON table(id);
(我不得不加上这个作为回答,因为我不能发表评论,我知道这更像是一个评论!!)

**编辑**

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

|   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)

它应该能够在很短的时间内更新全部80000条记录。

您是否尝试过为每一行生成单独的更新语句?不,这实际上很正常,您希望多久更新一次?这是否回答了您的问题@ADyson是的,对每个记录使用不同的查询大约需要800秒。这意味着什么“一些我不需要的xml记录”?听起来php需要做的另一项任务就像准备那些值你试过为每一行生成一个单独的UPDATE语句吗?不,这实际上很正常,你想多久做一次?这回答了你的问题吗@ADyson是的,对每个记录使用不同的查询大约需要800秒。这意味着什么“一些我不需要的xml记录”?听起来php需要做的另一项任务就像准备这些值一样。请更明确地说明
qty\u映射是什么?非常感谢。Hi@Melody-如果你看你的代码,你在顶部附近做了大量的case语句来设置基于id的数量。如果你看我的答案,你会发现我已经把你在示例中展示的对放入了我的数据库输出示例中。如果您将这数千个值对中的每一个放入数据库,您不需要大量的case语句,子查询会为您完成。哇!好的,我尝试了这个,结果如下:在创建
qty\u映射
表并为两个表
code
列编制索引后,总更新时间从
137秒
减少到
3秒
。非常感谢你!您能否更明确地说明什么是
qty\u映射
?非常感谢。Hi@Melody-如果你看你的代码,你在顶部附近做了大量的case语句来设置基于id的数量。如果你看我的答案,你会发现我已经把你在示例中展示的对放入了我的数据库输出示例中。如果您将这数千个值对中的每一个放入数据库,您不需要大量的case语句,子查询会为您完成。哇!好的,我尝试了这个,结果如下:在创建
qty\u映射
表并为两个表
code
列编制索引后,总更新时间从
137秒
减少到
3秒
。非常感谢你!