数据库存放数据大了,查询等操作就会存在瓶颈,怎么办?
1. 如果是单张表数据大了,可以在原有库上新建几张表table_0、table_1、table_2、.....table_n
写程序对数据进行分表:
--这里提供一种一种分表策略,这里只需维护分片字段与表序号的关系
伪代码:
if(主键id % n)= x
for( table:list [table_0、table1、table2、.....table_n ]){
if(table.split("_")[1] = x ){
//执行sql: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
}
}
如果数据还是很大,放在一个库都嫌拥挤,那就新增数据库,与上面的同理,就是维护分片字段与某数据库和某个库里的表
伪代码:假设有n个库,每个库有m张表
if(主键id % n)= x
if(主键id % m) = y
那么 大表里这条数据将落在第x库里的第y张表
执行
connet = JDBC.connet(x)
connet.stamet.excute(inset into y..... )
实现技术原理:
根据所使用的技术不同拦截层面有多种,我想到就有
1. SpringMVC 的拦截器可以在Controller层面实现上述分表策略
2. 使用Aop 进行拦截,也能实现在Controller或Service层面实现上述分表策略
3. 单独起一个微服务进行(如网关)进行拦截实现上述分表策略
4. 使用中间件mycat 、sharding jdbc等原理跟3是差不多的,只不过有更丰富的分表策略和更成熟的方案
当然实际我们会使用定时任务 + 线程池+本地缓存(存limit值,防重复) 去扫描大表数据 分段 select * from big_table limit 1,1000 这样分表
补充:水平切分和垂直切分