Mysql高并发更新

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (379)

我有一个mysql表:

CREATE TABLE `coupons` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `code` VARCHAR(255),
    `user_id` INT,
    UNIQUE KEY `code_idx` (`code`)
) ENGINE=InnoDB;

该表由数千/数百万个代码组成,最初user_id对每个人都是NULL。现在我有一个Web应用程序,它为同时访问该应用程序的数千名用户分配一个唯一的代码。考虑到非常高的流量,我不确定处理这个问题的正确方法是什么。我写的查询是:

UPDATE coupons SET user_id = <some_id> where user_id is NULL limit 1;

并且应用程序以1000 req / sec的并发性运行此查询。

我观察到的是整个表被锁定,这不能很好地扩展。我该怎么办?谢谢。

提问于
用户回答回答于

这个问题可能更适合DBA(而且我不是DBA),但我会尝试给你一些关于正在发生的事情的想法。

当您执行更新查询时,InnoDB实际上并不会锁定整个表。它的作用是下一个:它放置一个记录锁,它阻止任何其他事务插入,更新或删除值为coupons.user_idNULL的行。

使用您的查询(这取决于user_id为NULL),您不能具有并发性,因为您的事务将一个接一个地运行,而不是并行运行。即使你的索引coupons.user_id也无济于事,因为当你输入锁定InnoDB时,如果没有锁定,就会为你创建一个阴影索引。结果将是相同的。

因此,如果您想提高吞吐量,我可以考虑两个选项:

  1. 在异步模式下将用户分配到coupon将所有分配请求放入队列,然后在后台处理队列。可能不适合您的业务规则。
  2. 减少锁定记录的数量。这里的想法是在执行更新时锁定尽可能少的记录。要实现此目的,您可以向表中添加一个或多个索引列,然后在查询WHERE子句中使用索引Update

列的示例是product_id或类别,可以是用户位置(国家/地区,zip)。那么你的查询看起来像这样:

更新优惠券SET user_id = WHERE product_id = user_id是NULL LIMIT 1;

而现在InnoDB将只锁定记录product_id = <product_id>。这样你就会有并发性。

希望这可以帮助!

热门问答

云服务器中ping不可达,请教一下如何恢复?

推荐已采纳
本地主机 ping 不通实例可能由以下问题导致: 目标服务器的设置不正确 域名没有正确解析 链路故障 在确保本地网络正常的前提下(即您可以正常 ping 通其他网站),可根据以下操作进行排查: 检查实例是否配置公网 IP 检查安全组设置 检查系统设置 检查域名是否备案 检查域名解...... 展开详请

为什么加固之后生成四个文件?

腾讯云@移动安全

腾讯 · 移动开发工程师 (已认证)

腾讯云移动安全前端开发
推荐

选择最后一个_legu_aligned_signed.apk 文件,这个是加固并已重签名的文件。

COS Javascript SDK 为何没有 getService 方法?

因为 getService 请求的是 service.cos.myqcloud.com 或 cos.<Region>.myqcloud.com 域名,前端直接请求会导致跨域问题。 前端 js sdk 直接请求 bucket/object 相关的接口,虽然也会跨域,但你可以在 你...... 展开详请

iot设备通过mqtt协议连接,没有办法设置clientid?

DylanRichard

腾讯 · 产品经理 (已认证)

万物互联的时代,欢迎来到IoT的世界
推荐

物联网接入层有设备互踢的逻辑,如果是用同一个设备 ID 在不同地方登录,会导致其中一方被另一方踢下线。因此发现设备一直上下线时,需要确认是否有不同的人或者多线程在使用同一个设备 ID 执行登录操作。

实时语音识别支持c#平台吗?

支持的。虽然SDK没有C#的,但是可以通过API进行请求

如何延长签名有效期?

yinshawnrao

腾讯 · Web开发工程师 (已认证)

腾讯云搬砖工
推荐

如果需要自己生成签名,可以使用对象存储COS的SDK工具,里面有提供方法,获取下载链接,签名时间可以参数控制。

https://cloud.tencent.com/document/product/436/7753

扫码关注云+社区

领取腾讯云代金券