ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 分表设计 ## 水平分表 物理方式分表设计 自己手动创建多个数据表出来 php程序需要考虑分表算法:数据往哪个表写,从哪个表读 ![](https://box.kancloud.cn/089fec9429c5d7a0a1f94bf70160e188_858x218.jpg) 创建4个物理分表 ~~~ create table goods_0( id int unsigned not null auto_increment, name varchar(32) not null, price decimal(10,2) not null , primary key(id) )engine myisam charset utf8; create table goods_1( id int unsigned not null auto_increment, name varchar(32) not null, price decimal(10,2) not null , primary key(id) )engine myisam charset utf8; create table goods_2( id int unsigned not null auto_increment, name varchar(32) not null, price decimal(10,2) not null , primary key(id) )engine myisam charset utf8; create table goods_3( id int unsigned not null auto_increment, name varchar(32) not null, price decimal(10,2) not null , primary key(id) )engine myisam charset utf8; ~~~ php在哪个分表实现数据的读取、修改、删除: ~~~ $id = $_GET[‘id’]; $num = $id%4;//计算余数,该余数是当前处理记录对应数据表的序号标识。 //读取 $sql = “select * from goods_$num where id = $id”; ~~~ **php给哪个分表实现数据添加** 方案:创建一个独立的数据表flag,专门对记录的主键id值进行维护。 ~~~ create table flag( id int primary key auto_increment )engine myisam charset utf8; ~~~ 通过flag表获取ID,使用该ID,完成计算,确定向哪张表添加数据 ~~~ $sql = “insert into flag values (null)”;//该数据表需要定期delete清空。 mysql_query($sql) $id = mysql_insert_id(); $yu =$id%/4;//获取新记录的主键id值。 ~~~ ## 垂直分表 **水平分表:是把一个表的全部记录信息分别存储到不同的分表之中。 垂直分表:是把一个表的全部字段分别存储到不同的表里边。** 有的时候,一个数据表设计好了,里边有许多字段,但是这些字段有的是经常使用的,有的是不常用的。在进行正常数据表操作的时候,不常用的字段也会占据一定的资源,对整体操作的性能造成一定的干扰、影响。 为了减少资源的开销、提升运行效率,就可以把不常用的字段给创建到一个专门的辅表中去。 同一个业务表的不同字段分别存储到不同数据表的过程就是“垂直分表”。 例如: 会员数据表有如下字段: 会员表:** user_id 登录名 密码 邮箱 手机号码** 身高 体重 性别 家庭地址 身份证号码 以上表,有常用的,也有是不常用的 为了使得常用字段运行速度更快、效率更高,把常用字段给调出来,因此数据表做以下垂直分表设计: 会员表(主)user字段:user_id 登录名 密码 邮箱 手机号码 会员表(辅)user_fu字段:user_id 身高 体重 性别 家庭地址 身份证号码 以上把会员表根据字段是否常用给分为两个表的过程就是垂直分表。