首页 > 解决方案 > 即使有索引,更新查询也需要时间

问题描述

我有以下更新查询

UPDATE Member 
SET Gem=Gem+1 
WHERE UserId='4200000' 
LIMIT 1

该表Member有 4,250,000 行,UserId是 Index,大约 62G。现在,查询需要大约 0 时间,但是当大约 2500 个连接/进程发送这个简单的查询需要更多时间时,问题开始于峰值时间。

我搜索了很多,找不到任何东西。服务器硬盘驱动器Nvme不忙,这里最上面打印:

平均负载:3.60、3.26、3.39 %Cpu(s):22.2 us、9.0 sy、0.0 ni、66.7 id、0.5 wa、0.0 hi、1.6 si、0.0 st KiB 内存:总计 61679480、622156 免费、52283348 已使用、877376 buff/cache KiB 交换:总共 30932988,免费 11625264,使用 19307724。8401896 利用 Mem

CPU not invole 和 ram 只是获得 innodb_buffer_pool 保留 52G。

我得到的唯一帮助是LOCK SET 但没有找到任何有用的东西。

如您所见,源代码没有问题,如何知道简单的索引查询在高峰时间需要时间有什么问题?

标签: mysqlsqlinsert-update

解决方案


因为您的 UserID 是整数和 INDEXED,所以此查询

更新成员集 Gem=Gem+1 WHERE UserId='4200000' LIMIT 1

如果您从 UserID 数据周围删除撇号,效果会更好。您正在导致 TEXT 查找而不是使用 INTeger 数据来查找要修改的行。请在繁忙时间的计时前后发布。

SELECT @@innodb_io_capacity 的结果是什么?制造商使用您的 NVME 模型要求写入顺序的 IOPS 是什么?


推荐阅读