我有一个表,看起来像这样:
name: posts
columns:
- id
- sequence_id
- text
- like_count
ID是标准的自动递增的唯一整数索引。
序列ID应该类似-它也是唯一的整数索引。
不同之处在于,我希望在 update或insert 而不仅仅是insert时将其递增到表中新的最大值。
目前,我使用Redis计数器来实现这一点,在插入到数据库之前,我会递增该计数器。
不过,如果可能的话,我想去掉对Redis的依赖,只使用MySQL。
我想到的一个选项是创建一个post_updates表,它只包含一个自动递增的ID,我也是这样使用的,但感觉更糟。
另一种选择是进行全列扫描,以达到max(sequence_id)+ 1,但这实际上不是可伸缩的,而且会有争用条件。
有没有我不知道的更好的选择?
1条答案
按热度按时间2ic8powd1#
手册中有一个在MySQL中模拟序列对象的解决方案:
sequence
表本身不需要自动递增,它只存储一行。当您准备好在所描述的表中递增sequence_id时,首先按以下方式更新序列值:
现在,您可以在插入/更新表时使用该值:
或
请注意,这比自动递增要重一些,因为更新序列表会创建一个行锁,而不仅仅是自动递增锁。这可能会对流量速率设置上限,因为许多试图访问该表的并发客户端会相互排队。
如果你想要一个非常高吞吐量的解决方案,我建议继续使用Redis。