thinkPHP +mysql 分表用法例子

本文介绍了一种针对聊天室消息表的分表方法,通过用户ID计算来确定消息存储的具体表,同时提供了生成唯一ID的方法及如何进行跨表查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先根据自己的需要建立分表,我这里使用聊天室的msg 表,

将其分成msg_00,msg_01,msg_02,msg_03,msg_04,msg_05,msg_06,msg_07,msg_08,msg_09,等10张表

然后根据userID判断需要放在哪一张表;

第一步:

   判断我要放在哪一表:

 /*
     * 返回需要插入的表
     */
    public function get_table($table,$userid) {
    $str = $userid%10;
    if($str<0){
        $hash = "0".substr(abs($str), 0, 1);
    }else{
        $hash = substr($str, 0, 2);
    }

    return $table."_0".$hash;
}
第二步:

   生产我要插入的唯一ID

(因为如果数据库自己生成,你无法提前知道,就无法判断它要插入到哪一张表中,但方法有很多,今天我只学到这一种,望大神们指教):

/*
    * 返回需要的唯一ID
    */
    public function get_fetch_unique_bigint_id()
    {
        $start_timestamp = 1238119411;
        $ivan_len = 3;
        $time = explode( " ", microtime());
    $id = ($time[1]-$start_timestamp) . sprintf("%06u", substr($time[0], 2, 6));
    if ($ivan_len > 0) {
        $id .= substr(sprintf("%010u", mt_rand()), 0, $ivan_len);
    }
    return $id;
}
第三步插入到数据表:
      $msgID = $this->get_fetch_unique_bigint_id();
        $data['id'] = $msgID;
//        $this->ajaxReturn (json_encode($data),'JSON');

        $table = $this->get_table('msg',$msgID);
        $dd = M($table)->data($data)->add();
第三步遍历查询出来:
     
//循环查询所有的分表
$table = array("msg_00","msg_01","msg_02","msg_03","msg_04","msg_05","msg_06","msg_07","msg_08","msg_09");
$select = array();
$time = $data['time'];
foreach($table as $v) {
    $select[] = "(select * from $v where time=$time )";
}

$sql = join(' UNION ', $select);
$Model = new \Think\Model(); // 实例化一个model对象 没有对应任何数据表
$dataa =  $Model->query($sql);

当你的where需要很多条件时可以这么写
//循环查询所有的分表
$table = array("per_msg_00","per_msg_01","per_msg_02","per_msg_03","per_msg_04","per_msg_05","per_msg_06","per_msg_07","per_msg_08","per_msg_09");
$select = array();
foreach($table as $v) {
    $select[] = "(select * from $v where (receiver = '$nickname'OR receiver= '$receiver') AND (sender = '$nickname' OR sender= '$receiver'))";
}

$sql = join(' UNION ', $select);
$Model = new \Think\Model(); // 实例化一个model对象 没有对应任何数据表
$msg =  $Model->query($sql);


       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值