【问题标题】:Update query take time even with index即使有索引,更新查询也需要时间
【发布时间】: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


【解决方案1】:

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

更新成员 SET宝石=宝石+1 WHERE 用户 ID='4200000' 限制 1 个

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多