请教个 mysql 更新问题

讨论 未结 8 52
brader
brader 会员 2022年9月29日 09:49 发表
<p>有这样一条语句 <code>UPDATE table SET onsale=0 WHERE uid=116980</code></p> <p>uid 是有索引的,假如 uid=116980 的数据一共有 1 万条,执行这条更新语句大约需要 20s ,想问下,更新期间,mysql 是会一次锁住这 1 万条数据,还是每次短时间锁一条啊?</p> <p>如果他会一次锁住 1 万条的话,我要怎么避免这种长时间的锁定</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
8个回复
  • rqxiao
    2022年9月29日 09:49
    一次锁住这 1 万条数据
    0 0
  • nekolr
    2022年9月29日 09:49
    缩小锁定的范围,拆开更新?
    0 0
  • lmshl
    2022年9月29日 10:16
    1. 锁 1 万毋庸置疑 2. UPDATE table SET onsale=0 WHERE pk IN (SELECT pk FROM table where uid=116980 AND onsale <> 0 LIMIT <batch-size>) 重复执行几次,直至 effect rows = 0 我经常这么干,如果你这条查询走索引或者数据量不大的话就无所谓,数据量大且没索引的时候可以考虑先取到程序里再分批更新。
    0 0
  • 7911364440
    2022年9月29日 10:16
    分批更新的过程中如果有其它查询数据的请求进来,可能会查到中间状态的数据,需要考虑下会不会对系统有影响
    0 0
  • brader
    2022年9月29日 10:16
    好的,谢谢前辈,感觉这个解决方案适合我,想问下你平时<batch-size>一般设置多大? 100 ? 1000 ?
    0 0
  • cnoder
    2022年9月29日 10:16
    可以不 wherein ,直接 limit ,一样的,UPDATE table SET onsale=0 WHERE uid=116980 and onsale !=0 limit 100
    0 0
  • brader
    2022年9月29日 10:16
    是的,我就是查询到线上前面比较多数据的几个用户,每人有大概 100 万条数据要更新,我就是担心一次更新 100 万条,会把数据库搞死,想小批量更新
    0 0
  • dongtingyue
    2022年9月29日 10:50
    innodb 是锁行否则是锁表。每次更新少点
    0 0