Mysql分表的问题
本人数据库的知识有限,由于前期数据库设计的问题,导致现在分表遇到了问题。问题可以简单描述为:我有一个表bind,字段如下:
+----+------+---------+
| id | udid | user_id |
+----+------+---------+
下面两种操作的情况会同时出现:
操作1:update bind set user_id = 'user_id' where udid = 'udid';
操作2:update bind set udid = 'udid' where user_id = 'user_id';
由于这个表会被频繁的操作,当记录很大时,我要对它进行水平分表,这个时候问题就来了。
如果按照udid
取模分表则没有照顾到操作2的情况,如果按照user_id
取模分表则没有照顾到操作1的情况。
所以,现在想到的好一点的方法是将udid
与user_id
作为关键字分两套表,操作时用事务同时对两个表操作提交。但是这种方式比较麻烦,大家有没有好一点的想法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我觉得就按照
user_id
取模分表就行了无论对于哪个操作,
user_id
都是确定的,因此都可以根据它确定要修改哪个表。如果还要应对下面这两种操作的话
是否可以考虑这样分表:
根据 user_id 查 udid 时,把
1 和 2
或者3 和 4
join 到一起,然后查询根据 udid 查 user_id 时,把
1 和 3
或者2 和 4
join 到一起,然后查询这样既没有数据冗余,性能上应该也比单表要好,因为理想情况下,查询时涉及的记录数会比单表少一半。
当然,我对数据库操作的性能没怎么研究过,join 的性能究竟怎样我也不太清楚,这里只是提供一个思路。
最简答直接的方法就是增加一个属性。根据新属性分。
在业务逻辑无法修改,数据库现有设计也无法改动的情况下,你的逻辑是正确的,分两套表。其中一套作为主表,数据全部保存在上面,另外一套类似于索引表,只需要维护user_id与udid的映射关系即可。