mysql - 如何使用 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 秒,我认为这很安静。
我可以改变什么来加快速度?
谢谢!
解决方案
因为随着时间的推移,时间似乎越来越长,所以我希望您需要在 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 条记录。
推荐阅读
- python - 为什么我无法通过在 python 中包含 @login_required 的函数的单元测试?
- r - 如何使用此信息创建条形图?
- java - 如何重新计算变量?
- python - 为什么python写`而不是@
- postgresql - pq:在表上插入或更新违反外键约束
- laravel - 如何显示图像 laravel
- python - 使用NetCDF4在python中编写时间NetCDF文件
- react-native-flatlist - 如何在 React Native 的 scrollView 中为相同的 btn 赋予不同的样式?
- c++ - C++ std::memory_order_relaxed 混淆
- java - 模拟一个期望值的参数在 EasyMock 中失败