mysql分表+查询

mysql分表+查询php

垂直分表:mysql

  其实没啥好讲,就是 主键+经常使用列 放在原表中,再讲 主键+一些不经常使用列 放在另外的表中。面试

  这样一个数据页就能够存放更多数据。 可是缺点也明显,可能会增长join 或 union之类的操做。sql

水平分表:数据库

  今天面试被问到水平分表,忽然愣住了,分都知道,但分完如何有效查询就很差说了。session

  原则:具体状况具体分析。memcached

  常见几种分法:函数

    一、按时间分code

      典型应用:新闻类、qq状态、朋友圈动态等关注实时或最近的,能够用时间划分,好比当月一张表,上个月一张表。md5

    二、按区间分

      一般每张表都会有个自增id,能够利用自增id分,好比

      user1表 是1~50

      user2表 是51~100 //insert 操做完成后,判断id值,超过50w时,建立新表

    三、hash分表

      实质上没啥意思,对每一条插入的数据进行取模, 对于单挑记录查询还ok,若是查询相邻几行数据时,就悲剧了。 感兴趣的同窗能够看下面相关连接第一条。

  分表后查询:

    一、对于时间水平分表:

      假设朋友圈状态表,天天都会产生20w条记录, 建表 table_20150401 存放。而后用cron跑一个脚本,天天晚上凌晨建立新表,好比 table_20150402。在php程序中

     执行插入的函数进行封装,使用下面这两个函数。  复制代码

insertData($data){ $table = "table_".date("Ymd",time()); //生成当天表名 insert($data,$table); // 插入新的表中 }

GetData($condition){
//若是条件里面带了时间查找,好比:$condition[time] , 则分析出对应表名,选择对应一张或多张表 $table = "table_".date("Ymd",time()); //生成当天表名 Get($condition,$table); // 在新的表中查找 }

复制代码

    二、对于id区间划分

      新闻或朋友圈状态id 1~1000 1001~2000     1、数据库里面建表 breakup_table //这个表里专门记录,新分表和原表的 记录数,方便肯定查找哪一个表     好比: news_1 1 //起始key为1       news_2 1001 //起始key为1001       news_3 2001

        2、上述 news_1 之类的数据,第一次须要同数据库拿,以后能够放到session或memcached里面

复制代码

insertUser($data){    $table_num = getCurrentNewNum(); //这个值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1; $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 }

GetUser($condition){
$table_num = getCurrentNewNum(); $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 }

复制代码

    三、对于hash分表查询:

        典型user表 //单独拉出来说,由于比较特别,第一次查找可能比较花时间,由于必须根据用户名肯定去找哪一个表         能够这作:         $md5_val = md5($user_name); //用crc32()应该也能够,但何尝试,若是尝试记得%u,使其不为负         $first_val = substr($md5_val, 0,1);//而后去取第一个值         $decimal = hexdec($first_val); //十六进制转十进制         $table_num = $decimal%3 + 1; // 求余3,使得只有三张表,table_1,table_2,table_3           主要原理,利用user_name惟一性,导出md5惟一性,而后求余限制分表数量 复制代码

insertUser($data){

$table = "table_".$table_num); //生成指定表名
insert($data,$table);  // 插入新的表中

}

GetUser($condition){

$table = "table_".$table_num); //生成指定表名
Get($condition,$table);  // 在新的表中查找

}

复制代码

    hash 分表也可用于id区间分表,即用id值 取模。

水平分表,典型缺点,对于group by或order by之类的查询是灾难。 

相关文章
相关标签/搜索