数据库 - Mysql分表的问题
黄舟
黄舟 2017-04-17 11:14:57
[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的情况。

所以,现在想到的好一点的方法是将udiduser_id作为关键字分两套表,操作时用事务同时对两个表操作提交。但是这种方式比较麻烦,大家有没有好一点的想法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
PHP中文网

我觉得就按照 user_id 取模分表就行了

操作1:update bind set user_id = 'user_id' where udid = 'udid';
操作2:update bind set udid = 'udid' where user_id = 'user_id';

无论对于哪个操作, user_id 都是确定的,因此都可以根据它确定要修改哪个表。


如果还要应对下面这两种操作的话

select user_id from bind where udid = 'udid';
select udid from bind where user_id = 'user_id';

是否可以考虑这样分表:

设 user_id 的范围是 1~10
udid 的范围也是 1~10

表1
user_id  1~5
udid     1~5

表2
user_id  1~5
udid     6~10

表3
user_id  6~10
udid     1~5

表4
user_id  6~10
udid     6~10

根据 user_id 查 udid 时,把 1 和 2 或者 3 和 4 join 到一起,然后查询
根据 udid 查 user_id 时,把 1 和 3 或者 2 和 4 join 到一起,然后查询

这样既没有数据冗余,性能上应该也比单表要好,因为理想情况下,查询时涉及的记录数会比单表少一半。 当然,我对数据库操作的性能没怎么研究过,join 的性能究竟怎样我也不太清楚,这里只是提供一个思路。

天蓬老师

最简答直接的方法就是增加一个属性。根据新属性分。

PHPz

在业务逻辑无法修改,数据库现有设计也无法改动的情况下,你的逻辑是正确的,分两套表。其中一套作为主表,数据全部保存在上面,另外一套类似于索引表,只需要维护user_id与udid的映射关系即可。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号