两个业务,
一个业务多线程插入 N 条数据
另一个业务,多线程读取并删除 N 条数据 /或者使用 update 先修改数据加上唯一标签,然后读取,然后删除数据(update xxxx set use =1 token = uuid where use = 0 limit 100)
这两种读取并删除的方式
第一种方式要使用 for update 锁. 效率很低.
第二种方式使用 update 先修改数据,然后再删除数据,不用加锁,但是在多线程情况下效率更低,而且线程之间不会队列执行, 有的线程很快执行,有的会超时.
我考虑原因, 是 mysql 每个线程都会去数据的相同固定部分抓取数据
导致不管是 select 还是 update 都会冲突.
有没有更快的方式来实现这个功能呢? 什么类型的数据库,或者什么 sql 方案.
对 use 已经加索引了 但是加索引的作用不大, 我感觉 use 不是 0 就是 1 加了索引只是排除掉 use=1 的部分,这部分数据很少,use=0 的数据有几百万条. 但是 mysql 只会去头部取数据,导致冲突, 能不能让 mysql 每个任务都随机位置取数据呢.
业务需要统计数量等要求.所以不能用 list.
本人新手,表达能力不好,专业术语也不知道,实在抱歉,希望不吝赐教.
一个业务多线程插入 N 条数据
另一个业务,多线程读取并删除 N 条数据 /或者使用 update 先修改数据加上唯一标签,然后读取,然后删除数据(update xxxx set use =1 token = uuid where use = 0 limit 100)
这两种读取并删除的方式
第一种方式要使用 for update 锁. 效率很低.
第二种方式使用 update 先修改数据,然后再删除数据,不用加锁,但是在多线程情况下效率更低,而且线程之间不会队列执行, 有的线程很快执行,有的会超时.
我考虑原因, 是 mysql 每个线程都会去数据的相同固定部分抓取数据
导致不管是 select 还是 update 都会冲突.
有没有更快的方式来实现这个功能呢? 什么类型的数据库,或者什么 sql 方案.
对 use 已经加索引了 但是加索引的作用不大, 我感觉 use 不是 0 就是 1 加了索引只是排除掉 use=1 的部分,这部分数据很少,use=0 的数据有几百万条. 但是 mysql 只会去头部取数据,导致冲突, 能不能让 mysql 每个任务都随机位置取数据呢.
业务需要统计数量等要求.所以不能用 list.
本人新手,表达能力不好,专业术语也不知道,实在抱歉,希望不吝赐教.