首页 > 技术分享 > MySQL
收藏

MySQL优化 - 水平分割

07/03 09:23
大潇博客 原创文章,转载请标明出处

当一个表的数据很大的时候,怎么办 —— 分而治之


假设有5亿条数据,操作方法

1、放在一张表中,传统法CRUD(数据多,CRUD效率低,不合适)

2、使用内存缓存(数据量太大,不合适)

3、分表


分表规则:

login0

login1

login2

根据id%3=值

根据值来操作对应的表


查询步骤:

$tbname='login'.$id%3;

$sql=根据$tablename来查询


举例:

建三张表

login0,login1,ligon2

create table login0(id int primary key,name char(32),pw char(32));

create table login1(id int primary key,name char(32),pw char(32));

create table login2(id int primary key,name char(32),pw char(32));

创建一张生成id的表

create table uuid(id int primary key auto_increment,name varchar(64));


保存方法:

$mysqli = new mysqli("localhost","root","root","表名");

$sql = "insert into uuid(name) values('')";

if($mysqli->query($sql)){

$id = $mysqli->insert_id;       //获取上一次插入数据库的主键id

$tablename = "login".$id%3; //分几张表就对几取模

$sql = "insert into $tablename(id,name,pw) values('$id','aaa','aaa')";

if($mysqli->query($sql)){

echo "添加成功";

}else{

echo "添加失败";

}

}else{

echo "id生成失败";

}


查询方法:

$mysqli = new mysqli("localhost","root","root","dbname");

$id = intval($_GET['id']);

$tablename = "login".$id%3;

$sql = "select count(*) from $tablename where id = $id";

$res = $mysqli->query($sql);

$row = $res->fetch_all(MYSQLI_ASSOC);

if($row){

echo "在$tablename表中有这个用户";

}else{

echo "没有用户";

}


分表的关键,找到分表的标准

例如:

1、可根据id号分表

2、可根据年月日分表(财务报表、保险系统等...)


如果数据量大,有查询范围广的需求,可根据不同用户给出不同的权限,普通用户禁止大范围查询


还有个方案:

大表可以存在,分表也存在,一般情况下使用分表查询,特殊情况查询大表


小结:

我们在提供检索时,应该根据业务的需求,找到分表的标准,并在检索页面,约束用户检索的方式 -> 分页 , 如果有大表检索的需求,也是少数。


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311