mysql分表自测

13 篇文章 0 订阅

最近公司还好,但一想到过年就到了最头疼的时候了,现在先写一下分区,回忆一些,到时候老大没准就让我分了:

拿用户表(user)举例:如果它有1000w数据,肯定是要考虑优化的,那就分表吧,分区下一篇讲解,首先我是用pdo写了一个脚本是pdo.php内容是:(只是连接数据库用的)

<?php
$dsn = 'mysql:dbname=库名;host=主机号';
$user = '用户名';
$password = '密码';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->query('set names utf8;');
} catch (PDOException $e) {
echo 'Connection failed:' . $e->getMessage();
}

然后又写了一个脚本来建表,这里我是建了10张表

include "./pdo.php";

$i=0;
while($i<=9){
$sql="CREATE TABLE `user_0".$i."` (
`uid`         int(11) NOT NULL,
`uname`     varchar(30) NOT NULL,
`pwd`        varchar(32) NOT NULL,
`status`    tinyint(2)  NOT NULL,
PRIMARY KEY('uid')
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
$i++;
$pdo->query($sql);
}

这样10张表就建成了,因为要分表所以他们的(字段名,类型,长度,表引擎,包括字符编码)都要一样,建表之后下面我们就要将主表的1000W数据分别导入十张表里面了,话不多说看代码:

for($i=0;$i<=9;$i++)
{
    $sql = "insert into user_0$i(uid,uname,pwd,status,mark) select uid,uname,pwd,status,mark from user where uid%10=$i;";
    $pdo->query($sql);
}

注释:

INSERT INTO TB1() SELECT * from TB2
这个语句类型意思是:我们在开发、测试过程中,经常会遇到需要表复制的情况,如将 一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句。


到此为止已经把1000W数据平均写入到10张表里面了,但是还有一个问题是当有用户再次注册时放到哪个表里面,他的自增id在哪,怎么返回,停了几天,现在完善一下,接着听我唠


现在分表完成,如果你要在添加数据,先查主表,获取最后一个id,这个表是用户表,所以这样获取:

$last_uid = $pdo->query("select uid from 表名(user) order by uid desc limit 1");

有了主表id,接下来就是插入了,插入是要入分表的,思路就是:新建一张表(user_id)专门存放要将插入的id,在插入分表之前,先在这张表里插入分表将要插入的id然后获取这张表的user_inser_id,听不懂是吗,接下来看我的表信息(user_id表)建表sql:

<?php

include "./pdo.php";
$sql = "CREATE TABLE `user_id` (
`id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,

`user_insert_id` varchar(20)

) ENGINE = MYISAM";
$pdo->query($sql);

第一次我们可以通过查询主表最后一条数据获取主表最后id ,也就是$last_uid=3260000,把它加入到user_id这张表里。在给其他分表添加数据之前先让user_id这张表添加一条数据,这条数据你将要在其他分表将要插入的id,在这里也就是先让3260000+1,然后把他添加进user_insert_id字段里面,接下来为了安全起见,把你刚刚插入的字段查询出来,然后前面我分了10张表所以就吧这条数据(3260001)模10,看一下余数是多少,根据余数插入相对应的表中。

当第二次插入数据的时候呢,我们直接查询user_id表里的最后一个数据,把他加一,再模10,好了,到此为止刚才那个问题也解决了。那么,新的问题又来了,我们既然分表了,查数据的时候该怎么查呢,一共有10张表,现在我只是给一下思路,一共有三种方式:

第一种:你可以通过视图查询(Navicate)的视图

第二种:union查询,不过union是可以去除重复数据的所以查的时候最好用union all来查

第三种:使用mrg_myisam引擎来查询

这三种方法的具体例子,等我有时间再次跟大家分享


当然了分完表之后,你也完全可以不用新建一张表专门存入要插入的id,你可以把id存入缓存redis或者memcache中,只要你能保持服务器正常运行,不会发生缓存穿透或者缓存雪崩的话,把id存入缓存完全没有问题,当然了其实最最合适的做法就是专门写一个接口,用来获取id和到底插入哪张表,这种做法虽然有点麻烦但是最适合后期维护



结束语》》:我还是很喜欢你,就像皓月,半步青莲,愿你把酒持剑,归来仍是少年



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值