美文网首页mysql 知识库
高并发下的sql优化

高并发下的sql优化

作者: packet | 来源:发表于2018-07-16 20:18 被阅读55次

假设有数据库表中有列(列名是energy),作为一个计数器,这个计数器有一个上限。用户发来一个请求,参数是一个随机值,计数器会加上这个随机值,直到到达上限为止(不能超过上限)。我们需要记录处理用户请求所增加的值,这个值包括正数和零。一开始的sql如下:

<update id="updateTable" parameterType="java.util.Map">
    update table
    set energy = least(energy + #{incr, jdbcType=DECIMAL}, #{limit, jdbcType=DECIMAL}) 
    , UPDATE_TIME = sysdate
    where energy &lt; #{limit, jdbcType=DECIMAL} AND id = #{id, jdbcType=VARCHAR}
</update>

这条sql中,id表示某条记录的id,limit表示上限,incr表示增加的值(随机值,每次请求的数值不同)。由于sql使用了least方法,可以确保energy不会超过上限(超出的数值会截断)。

这条sql看起来没问题,测试环境中也工作良好。后来做压力测试,10个线程还工作良好,但线程数量增加到20时,发现了一个问题:用户的请求参数值不一定是增加的值。如果energy当前是9.5,上限是10。现在有A和B两个线程,A的incr是0.5,B的incr是0.2,B线程的请求先操作,energy变成9.7,然后再处理A线程的请求,也会成功,但A线程误以为0.5全部增加,其实只增加了0.3。

因为考虑到Mybatis的update不能返回实际增加值,所以我当时认为改动比较大,还想到用redis控制。但我试图找到一个简单方法,发现错误只是出现在即将封顶的情况,在高并发情况下其数量只有1-3条的。那么可以使用乐观锁,更新失败不要重试,相当于incr是0,按这种思路sql可以改成以下:

<update id="updateTable" parameterType="java.util.Map">
   update table
   set energy = energy + #{incr, jdbcType=DECIMAL} , UPDATE_TIME = sysdate
   where energy &lt; #{limit, jdbcType=DECIMAL} AND id = #{id, jdbcType=VARCHAR}
   AND energy + #{incr, jdbcType=DECIMAL} &lt;= #{limit, jdbcType=DECIMAL}
</update>

只是增加了一个where条件。在上面的问题中,A线程where条件是false,所以不会更新,会认为这次请求的incr是0

相关文章

  • 高并发下的sql优化

    假设有数据库表中有列(列名是energy),作为一个计数器,这个计数器有一个上限。用户发来一个请求,参数是一个随机...

  • MySQL实战14 慢查询优化join、order by、gro

    1.慢查询的优化思路 1.1优化更需要优化的SQL 优化SQL是有成本的高并发低消耗的比低并发高消耗影响更大 优化...

  • 高并发下的 Nginx 优化

    我已经谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apach...

  • Nginx高并发下的优化

    Nginx高并发下的优化 写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。...

  • Nginx高并发下的优化

    写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。参考资料为《Nginx高性...

  • Nginx高并发下的优化

    写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。参考资料为《Nginx高性...

  • nginx高并发下的优化

    写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。参考资料为《Nginx高性...

  • 高并发下的抽奖优化

    来源:rrd.me/fS8yz 一. 项目思考 由于项目发起了一个抽奖活动,发起活动之前给所有用户发短信提示他们购...

  • 常用sql优化2019-09-27

    sql优化 sql优化.................................................

  • 数据库索引相关问题

    如何定位并优化慢查询Sql 根据慢日志定位慢查询sql 使用explain等工具分析sql 修改sql或者尽量让s...

网友评论

    本文标题:高并发下的sql优化

    本文链接:https://www.haomeiwen.com/subject/wafipftx.html