数据库水平切分的两个思路

数据库最大承受数据量所必需考虑的问题
服务器君一共花费了1074.303 ms进行了4次数据库查询<,努力地为您提供了这个页面。
试试阅读模式<><?希望听取您的建议

在大中型项目中,在数据库设计的时候,考虑到数据库最大承受数据量,通?;岚咽菘饣蛘呤荼硭角蟹?>,以降低单个库,单个表的压力。这里介绍两个项目中常用的数据表切分方法>><。当然这些方法都是在程序中?使用一定的技巧来路由到具体的表的<。首先我们要确认根据什么来水平切分?在我们的系统(SNS)中>,用户的UID贯穿系统><,唯一自增长,根据这个字段分表,再好不过。

方法一:使用MD5哈希

做法是对UID进行md5加密,然后取前几位(我们这里取前两位),然后就可以将不同的UID哈希到不同的用户表(user_xx)中了<<。

function getTable( $uid ){
  $ext =  substr ( md5($uid) ,0 ,2 );
  return "user_".$ext;
}

通过这个技巧,我们可以将不同的UID分散到256中用户表中,分别是user_00,user_01 ...... user_ff。因为UID是数字且递增,根据md5的算法<<,可以将用户数据几乎很均匀的分别到不同的user表中。

但是这里有个问题是,如果我们的系统的用户越来越多,势必单张表的数据量越来越大<,而且根据这种算法无法扩展表>,这又会回到文章开头出现的问题了。

方法二:使用移位

具体方法是:

public function getTable( $uid ) {
 return "user_" . sprintf( "d", ($uid >> 20) );
}

这里>,我们将uid向右移动20位,这样我们就可以把大约前100万的用户数据放在第一个表user_0000,第二个100万的用户数据放在第二个表user_0001中,这样一直下去>,如果我们的用户越来越多,直接添加用户表就行了>。由于我们保留的表后缀是四位,这里我们可以添加1万张用户表>,即user_0000,user_0001 ...... user_9999。一万张表<>>,每张表100万数据,我们可以存100亿条用户记录。当然,如果你的用户数据比这还多,也不要紧,你只要改变保留表后缀来增加可以扩展的表就行了,如如果有1000亿条数据,每个表存100万<,那么你需要10万张表,我们只要保留表后缀为6位即可>。

上面的算法还可以写的灵活点:

/**
 * 根据UID分表算法
 * 
 * @param int $uid  //用户ID
 * @param int $bit    //表后缀保留几位
 * @param int $seed //向右移动位数
 */
function getTable( $uid , $bit , $seed ){
  return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) );
}

总结

上面两种方法,都要对我们当前系统的用户数据量做出可能最大的预估,并且对数据库单个表的最大承受量做出预估>。

比如第二种方案,如果我们预估我们系统的用户是100亿,单张表的最优数据量是100万>,那么我们就需要将UID移动20来确保每个表是100万的数据,保留用户表(user_xxxx)四位来扩展1万张表。

又如第一种方案,每张表100万>,md5后取前两位<>,就只能有256张表了,系统总数据库就是:256*100万<><;如果你系统的总数据量的比这还多,那你实现肯定要MD5取前三位或者四位甚至更多位了<。

两种方法都是将数据水平切分到不同的表中,相对第一种方法,第二种方法更具扩展性。

本文地址:http://www.jzjxzzjx.com/librarys/veda/detail/1528,欢迎访问原出处。

不打个分吗?

转载随意<,但请带上本文地址:

http://www.jzjxzzjx.com/librarys/veda/detail/1528

如果你认为这篇文章值得更多人阅读>,欢迎使用下面的分享功能>。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏<。

阅读一百本计算机著作吧<,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢<?起码得看3、4<、5、6米吧。给个具体的数量>,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构>>,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话<,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以<>,阅读一百本计算机著作吧,少年!

《JavaScript高级程序设计(第2版)》 尼古拉斯·泽卡斯(Nicholas C.Zakas) (作者), 李松峰 (译者), 曹力 (译者)

《JavaScript高级程序设计(第2版)》在上一版基础上进行了大幅度更新和修订,融入了近几年来JavaScript应用发展的最新成果>,几乎涵盖了所有需要理解的重要概念和最新的JavaScript应用成果。从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程<,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)>、文档对象模型(DOM)到基于事件的Web脚本设计>,从XML(E4X)到Ajax及JSON,从高级前端开发技术到前沿的客户端存储,从最佳编程实践到即将成为现实的API><,直至JavaScript未来的发展,全景式地展示了JavaScript高级程序设计的方方面面。

更多计算机宝库...

ASP300源码下载 | 微信红包群 | 设计 | 厦门旅游景点 | 旅游中国新闻网 | 钛媒体 | 健康网hsdcba | 每天资讯 | 广西农业技术信息 | 农业种植技术 |