https://blog.csdn.net/qq_17392301/article/details/45501597?utm_source=blogxgwz4
Mysql的分表技术
水平分割技术:->以qq用户登录为例:
创建uuid表
create table uuid (id int unsigned primary key auto_increment);
创建3张用户表
create table qqlogin0
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam charset utf8;
create table qqlogin1
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam charset utf8;
create table qqlogin2
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam charset utf8;
register.php
//完成注册
$name=$_GET['name'];
$pwd=$_GET['pwd'];
if(empty($name)||empty($pwd)){
die('fail');
}
$con=mysql_connect('localhost','root','root');
if(!$con){
die('err');
}
mysql_select_db('temp');
$sql="INSERT INTO uuid values(null)";
if(mysql_query($sql,$con)){
$id=mysql_insert_id();
//确定把这个用户添加到哪个表
$tabname='qqlogin'.$id%3;
$pwd=md5($pwd);
$sql="INSERT INTO $tabname values($id,'$name','$pwd')";
if(mysql_query($sql,$con)){
echo '编号为 '.$id.' 用户添加到'.$tabname;
}else{
echo '添加失败';
}
}
login.php
//完成登录
$id=$_GET['id'];
$pwd=$_GET['pwd'];
if(empty($id)||empty($pwd)){
die('fail');
}
$con=mysql_connect('localhost','root','root');
if(!$con){
die('err');
}
mysql_select_db('temp');
$tabname='qqlogin'.$id%3;
$sql="SELECT pwd FROM $tabname WHERE id=$id";
$res=mysql_query($sql,$con);
if($row=mysql_fetch_assoc($res)){
echo '在'.$tabname.'存在 id为='.$id;
}else{
echo '错误.或者用户不存在!';
}
对水平分割的考虑.
②其它的条件
思考: 如果我们做的是一个平安保险公司的一个订单(8999999999000000条)查询功能.
,如何处理海量表?->按时间.
分表的标准是依赖业务逻辑(时间/地区/….)
安装字符不同. a-z
我们给用户提供的查询界面一定是有条件,不能让用户进行大范围.(世界),如果需要的可以根据不同的规则,对应多套分表.
检索时候,带分页条件,减少返回的数据.
项目中,灵活的根据需求来考虑->需求
垂直分割:
所谓垂直分割,就是把某表的大字段,并且不是经常查询,单独的放入到一张表去,比如下面案例: