美文网首页
php业务层上如何处理分表后的数据

php业务层上如何处理分表后的数据

作者: 回眸淡然笑 | 来源:发表于2020-08-07 22:44 被阅读0次

对于引入数据库中间件的方式,好处是对原有业务代码侵入较少,数据集中处理,易于管理。坏处是布署复杂,需要分出精力去管理,而且增加了proxy层,效率势必会减弱,所以说鱼和熊掌不可兼得,但是使用数据中间件是公司往高级业务发展的终极方向(如果说未来公司真的大了)。

对于mysql,在高并发访问时,容易引起表锁,所以分表可以在定程度上解决这个问题,分表方式不在具体细说,数据分表了,该如何操作。

举个例子:

下面有两个表,两个表各有一亿的数据。

用户表:members

uid:用户uid username:用户名 friends:好友数 regdate:注册日期

用户扩展信息表:members_profile
uid:用户uid province:省 address:地址

根据uid%4分表
members表被分成4个

members_1,members_2,members_3,members_4

members_profile同理

分表后带来什么改变:

members和membes_profile表基本没用了。可以保留7天然后删除。

members_n表的uid肯定不能自增,所以增加membersuid表,建立一个字段uid,设为主键并且自增。增加用户前,先往membersuid表插入一表数据,然后根据insert_id()获取uid。

1、分表前:select uid,username from members where uid in(1,2,3,4,5,6,7,8,9)一行获取数据

分表后:

对查询uid取模处理

//要查询的uid

$beforeUids = array(1,2,3,4,5,6,7,8,9);

$unionConditions = array();

$selectSql = array();

foreach(beforeUids asv){

unionConditions[v%4+1][] = $v;

}

foreach(unionConditions ask => $v){

selectSql[] = 'select uid,username from members_'.k.' where uid in('.implode(',',$v).')';

}

mysql_query(implode(' union ',$selectSql));

2、分表前:select uid,username from members where 1 order by friends desc limit ;

这里要按好友数降序排列,我们该怎么办,有一种方式是,分表前,我们需要建立一张索引表,先从索引表根据排序后查询出数据,然后在去查询分表的内容,但是,索引表容易过大,所以还是会成为瓶径,个人认为还有一种方案,启用redis的zset数据结构来专门存储friends的排序,因为zset自带排序光环。但是增加了业务更新和插入数据的业务逻辑,并且数据也产生冗余,但还是建议尽量增加where条件定位查询表。zset请自行百度查询

分表后:

1、从redis里获取根据friends排序好的uid

uids =redis->zRange("user_friends",limitStart,recordNums);

2、对uid取模,使用union联接查询mysql

3、因为取模后查询出来的数据是无序的,对查询出来的数据,在业务层上需要排序

4、输出数据

3、分表前:select uid,username from members where uid in(10,20,30,40) and friends > 20;

分表后:跟1的方式一样,分析where后面的查询,分解成select uid,username from members_1 where uid in(10,20,) and friends > 20 union....

4、分表前:select uid,username from members where username = “xxxx”

这种方式,个人建议,针对where后面的查询条件并且是字符串型的,使用开源的sphinx建立索引。

分表后:从sphinx根据username查询出uid,然后去mysql取数据

5、分表后的join查询,尽量修改成多条sql语句查询。

相关文章

  • php业务层上如何处理分表后的数据

    对于引入数据库中间件的方式,好处是对原有业务代码侵入较少,数据集中处理,易于管理。坏处是布署复杂,需要分出精力去管...

  • MySQL高级

    分库分表 分库后问题 跨库跨表join问题全局表,基础数据配置数据所有库都拷贝一份字段冗余系统层组装,业务层分别查...

  • 分库分表后全局唯一ID的四种生成策略对比

    分库分表之后,ID主键如何处理? 当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然...

  • NO.77 系统分层

    1.分层 1)如何分层? 表示层(UI):数据展现/操作界面,请求分发。 业务层(服务层):封装业务逻辑处理。 持...

  • APP开发实战54-业务逻辑层设计(Presenter)和数据访

    15.2.3业务逻辑层设计(Presenter) 业务逻辑层包括业务处理、数据的生成、处理和转换等业务逻辑相关的类...

  • sharding-jdbc分库分表入门知识点

    为什么要分库分表 随着业务扩大,系统访问量增大,数据表数据增大,导致数据库性能出现瓶颈 如何分库分表 水平分库分表...

  • WEB三层架构

    界面层(表示层):用户看到的界面 业务逻辑层:处理业务逻辑 数据访问层:操作数据存储文件

  • 单表查询的演变

    单表查询是互联网业务中常用的手段.引入单表查询后,数据库负责简单读取数据,应用需要解决如何将查询落到核心表上! 现...

  • MVC MVVM MVP MVCS

    MVC: M定义数据格式,进行数据的读写V展示数据,处理非业务逻辑,C层处理主要业务,控制 V-M 层的数据流,处...

  • MVC三层结构

    Model模型层,处理数据库的数据,业务逻辑处理 View视图层,界面层,前台的结构 Controller控制层,...

网友评论

      本文标题:php业务层上如何处理分表后的数据

      本文链接:https://www.haomeiwen.com/subject/ohxcdktx.html