当一个表的数据很大的时候,怎么办 —— 分而治之
假设有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、可根据年月日分表(财务报表、保险系统等...)
如果数据量大,有查询范围广的需求,可根据不同用户给出不同的权限,普通用户禁止大范围查询
还有个方案:
大表可以存在,分表也存在,一般情况下使用分表查询,特殊情况查询大表
小结:
我们在提供检索时,应该根据业务的需求,找到分表的标准,并在检索页面,约束用户检索的方式 -> 分页 , 如果有大表检索的需求,也是少数。
上一篇:MySQL优化 - 索引
下一篇:MySQL优化 - 垂直分割