主页
看看
说说
主页
说说
看看
登入
注册
首页
提问
分享
建议
讨论
公告
动态
其它
发表新帖
请教个 mysql 更新问题
讨论
未结
8
52
brader
会员
2022年9月29日 09:49
发表
打开或者下载
APP,畅享极致体验
<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
评论
回复
所在专栏
提问
分享
建议
讨论
动态
其它
阅读权限
默认,所有用户可见
LV1及以上用户可见
LV2及以上用户可见
LV3及以上用户可见
LV4及以上用户可见
LV5及以上用户可见
LV6及以上用户可见
会员专享
管理员可见
确认修改
相关帖子
香港行的一些见闻,去过没去过的都来了解下
6
Rime 输入法真是简洁啊。
4
win11 间歇性卡顿, 每十几秒卡顿半秒, 声音鬼畜, 画面不动
0
5 家公司工作了 18 年,分享些工作经验,也写给自己
0
如何看待满嘴脏话的人?
1
有偿求租 chatgpt 账号,自用应付工作不分享
0
孩子小学一年级学习跟不上,每天晚上作业写到快 12 点,今天老师给我打电话建议明年重读一年级
0
2023 年了, GoWeb 应该选择 Goframe、Gin、Beego、Iris 哪一项?
20
看隔壁邻居噪音有感,自己也遇到了楼上噪音问题,那么带降噪耳机可以解决吗?
8
使用 usb 上行线接入显示器后插入 U 盘,文件管理器没有反应
0
友情链接
聚合社区