BeanShell获取数据库表的方法

一,有的数据库采用hashCode,表的某一个字段值的hashCode

String mchNo="865039288932112";

Long mn=(long)mchNo.hashCode();

int tableIndex=Math.abs(mn%4);//除以4的余数

String tableIndexstr=tableIndex.toString();

log.info("表的分片="+tableIndexstr);

二,有的数据库自己内部写的hashCode方法,也是根据某个字段算出来的,route_key

import java.util.zip.CRC32;

String acctNo="62270010352432323":

CRC32 crc32=new CRC32();

crc32.update(acctNo.getBytes());

Long hashCode=crc32.getValue();

int dbx=Math.abs(hashCode%4);

// int dbx=Math.abs(hashCode%4)+${num};有的环境比别的环境库多了一个分片,多加1

int tableNum=Math.abs(hashCode%256);

查库select * from paydb${dbx}.t_context_${tableNum} where route_kdy="v";

查库select * from paydb0.t_context_150 where route_kdy="62270010352432323";

上面是通过beanshell获得库表

可以用select src('${acctNo}')%4,crc32('${acctNo}')%256

垂直分表是表结构的拆分,水平分表是表数据的拆分

垂直分库
水平分库:多个相同的数据库放在不同的服务器上。
垂直分库:将一个数据库中的表,按照逻辑功能进行划分,放到不同的数据库中。实现专库专用。
水平分表:表的字段不变,但是根据某种规则分成多个表,比如id为奇数的为一个表 偶数的为一个表。
垂直分表:将表中的字段进行分割,把经常查询的字段放在一起,不经常查询的字段放在一起,放在不同的表中。

通俗点说垂直分库就是“大表拆小表”,基于列字段进行的
    拆分原则一般是表中的字段较多,将不常用的或者数据较大,长度较长的拆分到“扩展表 如text类型字段
    访问频次低、字段大的商品描述信息单独存放在一张表中
    访问频次较高的商品基本信息单独放在一张表中
垂直拆分原则
    把不常用的字段单独放在一张表
    把text,blob等大字段拆分出来放在附表中
    业务经常组合查询的列放在一张表

水平分表把一个表的数据分到一个数据库的多张表中,每个表只有这个表的部分数据
核心是把一个大表,分割N个小表,每个表的结构是一样的,数据不一样,全部表的数据合起来就是全部数据
针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去
但是这些表还是在同一个库中,所以单数据库操作还是有IO瓶颈,主要是解决单表数据量过大的问题
减少锁表时间,没分表前,如果是DDL(create/alter/add等)语句,当需要添加一列的时候mysql会锁表,期间所有的读写操作只能等待

再来个需求:高并发的项目中,水平分表后依旧在单个库上面,1个数据库资源瓶颈 CPU/内存/带宽等限制导致响应慢,需要进行优化

这时候就用到水平分库啦。

把同个表的数据按照一定规则分到不同的数据库中,数据库在不同的服务器上
水平分库是把不同表拆到不同数据库中,它是对数据行的拆分,不影响表结构
每个库的结构都一样,但每个库的数据都不一样,没有交集,所有库的并集就是全量数据
水平分库的粒度,比水平分表更大
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值