mysql - 即使有索引,更新查询也需要时间
问题描述
我有以下更新查询
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 但没有找到任何有用的东西。
如您所见,源代码没有问题,如何知道简单的索引查询在高峰时间需要时间有什么问题?
解决方案
因为您的 UserID 是整数和 INDEXED,所以此查询
更新成员集 Gem=Gem+1 WHERE UserId='4200000' LIMIT 1
如果您从 UserID 数据周围删除撇号,效果会更好。您正在导致 TEXT 查找而不是使用 INTeger 数据来查找要修改的行。请在繁忙时间的计时前后发布。
SELECT @@innodb_io_capacity 的结果是什么?制造商使用您的 NVME 模型要求写入顺序的 IOPS 是什么?
推荐阅读
- c - -Werror 在 Ubuntu 终端中有什么作用?
- swift - 在这种情况下实现堆栈视图的最佳方式
- javascript - 按某些字母的大多数出现对数组进行排序
- android - 如何从对话框片段中设置片段中的文本?
- oracle - 如何更改数百个 Oracle 调度程序作业的状态
- ios - iOS String range(of:options:range:locale:) 确实适用于有效的正则表达式
- windows - 如何访问位于 Windows 上具有保留系统名称(如“CON”)的文件夹中的本地文件?
- javascript - 自动滚动到表格底部
- javascript - JS函数从后端调用给函数未定义的错误
- c# - Unity:在 start() 中的其他对象上运行脚本