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;