最新公告
  • 欢迎您光临AA分享网,一个高级程序员的学习、分享的分享平台!立即加入我们
  • 数据库水平切分的方法有哪些?数据库字段设计方法有哪些?

    众所邹知,数据库的无论是在设计过程中,还是在使用过程中,都存在一些小技巧和方法。因此,经常使用数据库的人都会总结这些方法。本文要总结的方法是:数据库水平切分的方法有哪些?数据库字段设计方法有哪些?关于数据库水平切分的方法有两个,而对于数据库字段的设计方法这里总结了12点,下文是详解。

      数据库水平切分的方法有哪些?

      方法一:使用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( "%04d", ($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取前三位或者四位甚至更多位了。

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

      数据库字段设计方法有哪些?

    1. tinyint 是-128到128
    。当属性设置为unsigned的时候。最大值就是255了。现在知道为什么需要设置为unsigned属性了。原来是为了最大限度的使用给予的存储空间。如果不设置。那么假如你的值都是正数的。那么-128这一百多个数字就相当于是浪费了。

    2. tinyint会自动设置为tinyint(3)。

    3. smallint 不设置unsigned的时候,也有3万多的样子。

    4. tinytext 就是255个字节。大概就是存储127个中文的样子
    tinytext就相当于varchar类型。把它看成这样的该类型就容易理解了。

    5. int 类型phpmyadmin默认会设置int(10)。

    6. 概念纠正:原来一直以为这里的10表示位数。直到有次想保存1101061021496,结果在字段中的值都变成了:4294967295。
    看MySQL手册上说:

    (int后面括号的数字)显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

    7.
    int的范围:-2147483648到2147483647。刚好是10个位,那么就是数十亿级别的数字。数据库设计经验:像订单的值非常大。不确定,如果达到10位数,还不如使用varchar类型。fangwei就没有使用int,而是varchar类型。

    8. 从上面也告诉我一个经验:如果保存在数据库的值都变成一样的。也就是无论我是1101061021496
    还是1101061021569,结果都变成了固定的值,比如4294967295。那么可以考虑确认是否是数据库该字段的范围问题。这样的问题出现过好几次了。就是没有掌握思路。导致浪费了不少时间。

    9. 将字段设置为not null
    还出于另外一种考虑:mysql表的列中包含null的话,那么该列不会包含在所有中。也就是使用索引是无效的。所有,考虑今后会使用索引的字段,就要设置字段属性是not
    null。

    10. 如果你要保存NULL,手动去设置它,而不是把它设为默认值。

    11. 考虑到这个字段今后会作为查询关键字使用like的形式进行搜索。那么要将该字段定义成索引。这样使用like查询就会更快。

    12. 现在终于体会到到国外作者书籍上提到:设计数据库之前要问自己,之后会查询哪些数据。 考虑了这些,以后有什么查询需要。结构都能适应了。

    上述就是关于数据库水平切分的方法有哪些,以及数据库字段设计方法有哪些的全部内容,想了解更多关于数据库的信息,请继续关注。

    AA分享网一个高级程序员的学习、分享的IT资源分享平台
    AA分享网-企业网站源码-PHP源码-网站模板-视频教程-IT技术教程 » 数据库水平切分的方法有哪些?数据库字段设计方法有哪些?
    • 277会员总数(位)
    • 6130资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 788稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情