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
发表评论