唯一索引能否插入空_互联网典型技术应用场景---批量插入数据

我们经常会遇到新增数据,一次增加的量会比较大的情况,都会进行批量的插入数据,insert into A(id,key1,key2,key3..)values(...),会进行一次大批量的插入操作。如果id不会重复,而且表A,仅仅是以,id为主键,其他唯一性索引没有的情况,这种插入操作不会有问题,但是当A中出现唯一性索引,(key1,key2,key3)的时候,那么在高并发的插入操作中,就出现一些异常的情况,会出现大量插入操作,等待,触发锁超时,长时间占用了大量的数据库连接。

那么为什么呢?因为mysql进行唯一性检测的时候,使用的是S锁,就是共享锁,mysql的锁,从大的分类上有共享锁S和排他锁X,共享锁,顾名思义,就是其他的S型锁,也可以完成加锁操作。那么好理解,这就是多个mysql连接,出现了重复的数据,都是去进行唯一性检测,申请共享锁,这样的话,就会造成比较多的mysql连接超时,数据库吞吐下降。

那么如何进行优化,避免这种情况呢?

那么就是redis分布式锁+db查询,进行流量的消减。首先是根据唯一性索引构造一个key,然后使用redis的setnx(key,value,timeout),不通过,那么直接返回掉,通过则进行db查询,将如果没有数据,执行插入操作,如果有数据,则返回掉,经过两步的处理,能够挡掉很多重复的数据流

c74b5b16438dddcfeaae560db19c773d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值