mysql 分表

当数据量增大时,通过分表可以有效提高数据库性能。本文介绍了一种MySQL分表策略,包括创建多个数据表,建立合并查询表以及生成唯一ID的方法。在TP5框架中,通过获取随机学号、自增ID和表名,实现数据插入到对应的分表中。分表结构保持一致,使用MRG_MyISAM引擎的合并表用于查询,而ID通过单独的`auto_id`表生成。

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

mysql 分表


前言:当程序数据量大的时候 我们就要考虑分表存储数据

思路:

  • 1.首先根据数据量创建n(本文10)个分表(sql1),需要注意的是,这里的id不能设为自增,而且所有的表结构必须一致,包括结构,类型,长度,字段的顺序都必须一致
  • 2.创建合并表,用于查询(sql2),注意,合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致
    这里的INSERT_METHOD=0(某些低版本不支持 则改为INSERT_METHOD=NO)表示不允许对本表进行 insert操作。当需要查询的时候,我们可以只对user这个表进行操作就可以了,
    也就是说这个表仅仅只能进行select操作,那么对于 插入/更新(insert/update)操作 就首先需要就是获取唯一的id
    3.创建id表来专门创建id(sql3) 详见方法 get_AI_ID

演示: 本文采用 tp5来演示哈

public function index(){
        $time = time();
        //获取随机学号
        $guid = $this->get_guid(20,'');
        //获取自增id
        $id = $this->get_AI_ID();
        //获取表名
        $table_name = $this->get_Table_Name($id);

        $res = Db::table($table_name)->insert([
            'id'          => $id,
            'name'        => '李四'.$guid,
            'number'      => $guid,
            'create_time' => $time,
        ]);
    }
    private function get_guid(int $length=36, string $prefix=''){
        $arr = [];
        $str = '0123456789abcdef';

        if($length > 0){
            for($i=0;$i<$length;$i++){
                $arr[$i] = substr($str,floor(rand(0,1600)/100),1);
            }

            if($length>25){
                $pad = bcdiv($length,4)-1;
                $arr[$pad] = $arr[($pad+5)]= $arr[($pad+10)] = $arr[($pad+15)] =  '-';
            }

        }
        return $prefix.implode('',$arr);
    }
    //获取自增id
    public  function get_AI_ID() {
        return Db::table('auto_id')->insertGetId(['id'=>null]);
    }
    //获取表名
    function get_Table_Name($openid){

        $last_one=substr($openid,-1);
        $last_two=substr($openid,-2,1);

        //对截取字符串进行转换,拼接和取余
        $tmp_str=intval(ord($last_one)) + intval(ord($last_two));

        return 'user_'.$tmp_str%10;
    }

sql1:

CREATE TABLE `user_0` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_1` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_2` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_3` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_4` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_5` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_6` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_7` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_8` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE TABLE `user_9` (
    `id` BIGINT( 20 ) NOT NULL ,
    `name` VARCHAR( 200 ) NOT NULL ,
    `number` varchar(20) NOT NULL ,
    `create_time` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

sql2:

CREATE TABLE `user` (
`id` BIGINT( 20 ) NOT NULL ,
`name` VARCHAR( 200 ) NOT NULL ,
`number` varchar(20) NOT NULL ,
`create_time` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY ( `id` )
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO union =(`user_0`,`user_1`,`user_2`,`user_3`,`user_4`,`user_5`,`user_6`,`user_7`,`user_8`,`user_9`);

sql3:

CREATE TABLE `auto_id` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小阿巳

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值