大家 mysql 分表的哈希算法是怎样的?

发布于 2022-09-06 11:30:26 字数 452 浏览 18 评论 0

比如把 users 用户表分为 100 个表,users_1 ~ users_100,可以根据 userid 进行哈希,这样分成 100 张表,我们的算法是:

function hashID($id, $max)
{
    $md5 = md5($id);
    $str1 = substr($md5, 0, 2);
    $str2 = substr($md5, -2, 2);
    $newStr = intval(intval($str1 . $str2, 16));
    $hashID = $newStr % $max + 1;
    return $hashID;
}

参数 $id ,就是分表的字段,如 userid,$max 是分成多少张表。

为什么不直接 userid%100+1 这样获取分表呢?分布也是比较均匀的吧,为什么要采用如上的函数,各位业务中分表的算法是怎样的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

兔小萌 2022-09-13 11:30:26

少用% 取模 扩展表的话就蛋疼了

真心难拥有 2022-09-13 11:30:26

分表hash算法有多种,我们原来分0-9,也搞过md5取最后一位0-9a-z,这个没有绝对的好坏只说,看量吧。

至于不能直接用%,需要考虑大整数溢出的问题:
2的32次方:4294967296

4294967296%100 // 结果为0
fmod(4294967296, 100) // 为96

简单的办法就是substr($str, -2);

我做我的改变 2022-09-13 11:30:26

963,1040,1008,1016,992,1010,997,1000,1025,998,971,1036,962,998,972,954,1040,931,953,1018,1054,992,934,983,1027,973,1021,1044,997,1010,1062,978,988,1028,972,986,979,922,1032,924,993,1055,1054,1031,1023,981,1027,1017,1005,1031,1004,1009,994,1004,967,1026,1016,984,1032,987,1053,964,978,983,985,992,948,1061,1068,993,933,1028,967,1010,1007,962,1018,978,1003,1036,1001,1021,1006,1006,1041,1022,971,957,956,1007,1023,952,1011,988,991,984,1020,1025,1003,1018

这个10000个数分100个表,平均每个表数的总个数,分布的很均匀了好吧。
然后用哈希速度快,也很装逼有木有^_^
图片描述

℡寂寞咖啡 2022-09-13 11:30:26

crc32 + 取模 简单

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文