php+mysql分表处理

文章描述:

数据分表必须要达到一定的数量级,并且影响了我们的用户的访问速度,性能下降的情况下才能考虑去做分表处理!

mysql 分布式之分表思路,用id取模方式来进行处理选择哪张表,比如:id=7,有4张表,则7%4=3,模为3,路由到用户表3

 

用户表users

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `users` ADD PRIMARY KEY (`id`);

ALTER TABLE `users` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

分表user0


CREATE TABLE `user0` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `user0` ADD PRIMARY KEY (`id`);

ALTER TABLE `user0` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

分别user1

CREATE TABLE `user1` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `user1` ADD PRIMARY KEY (`id`);

ALTER TABLE `user1` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

插入数据

$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "laravel";

// 检测连接
try {
    // 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname);
    echo "连接成功";
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

$sql = "INSERT INTO users (name, email, password) VALUES ('zaizai', '123@qq.com', '123')";

if ($conn->query($sql) === TRUE) {
    echo "新记录插入成功";
	//获取user主表插入的最后一条sql的id
	 $insert_id = $conn->insert_id;
	 //对刚才入库成功的记录的id取模 如果你是两种用户分表那么就%2如果是200张那么就%200
	$d = $insert_id%2;
	//取模之后 获取到最后的模 任何数对2取模那么不是0就是1 任何数对200取模那么模就是0到200之间
	//插入到不同的用户分表当中去
	$_sql = "INSERT INTO user{$d} (name, email, password) VALUES ('zaizai', '123@qq.com', '123')";
	$ru = $conn->query($_sql);
	
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

 

更新数据

$id = $_GET['id'];
//对主键id取模从而来判断操作哪张分表
$d = $id%2;

$name = "xiaotuzi";
$conn->query("UPDATE user{$d} SET name='{$name}' WHERE id={$id} ");

 

 

其实我们是利用了取模的形式做了一个中间件的功能,根据模的数值去往不同的 user0 还有 user1 当中插入数据,达到了分发的效果

整个过程 user 主表一定是先插入数据的,然后根据模再去往不同的分表里面插数据;

需要强调的是 user 分表里面的 user_id 主键一定不是自增的,一定是根据 user 主表里面的 id 来插入的,必须保证和主表里面的主键 id 保持一致!

需要强调的是 user 主表和 user0 user1 分表一定是字段属性相同的直接复制即可,只是把数据分发到不同的表里面去了,这也叫水平分表!

在做 mysql 的水平分表的时候要记住,潜规则,默认的新增的时候我们插入到 user 主表然后根据取模插入到不同的分表里面去,但是删除,修改,查看,都和主表没关系了,主表只有在新增的时候往里面写入数据根据 id 取模再分发到不同的分表里面去!当然主表也可以做一些其他方面的统计。

发布时间:2023/04/26

发表评论