【发布时间】:2019-10-27 03:59:14
【问题描述】:
我有以下 UPDATE 查询
UPDATE Member
SET Gem=Gem+1
WHERE UserId='4200000'
LIMIT 1
那个表Member有425万行,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已使用,8773976 buff/cache KiB 交换:总共 30932988,11625264 免费,19307724 已使用。 8401896 可用内存
CPU not invole 和 ram 只获得 innodb_buffer_pool 预留 52G。
我得到的唯一帮助是LOCK SET 但没有找到任何有用的东西。
如您所见,源代码没有问题,如何知道一个简单的索引查询在高峰时间需要时间是什么问题?
【问题讨论】:
-
您没有定义“更多时间”。如果你说它需要 2 秒,那对于 2500 个连接来说还不错。如果你说2分钟,那将是一个问题。我不太了解 MySQL,但看起来有 151 个同时客户端连接的限制。您可以尝试增加 max_connections
-
您也可以尝试实现“连接池”,这将允许我的多个线程使用单个连接。
-
你的
UserId不是整数吗? -
“62G”是否意味着成员表有 62 GB 大?对于只有 4,250,000 行的表来说,这是相当大的。每行超过 150 KB。我会说那是你的问题。
-
@Robert Paulsen 最大连接设置为 6500,这不是问题。
标签: mysql sql insert-update