近期被分配去处理数据问题,发现有几张表的数据量有点多
领导说最好是30W-50W做一次分表
看了自己项目中的分表处理方式感觉收益颇丰
在mysql中有一个信息数据库infomation_schema 这里面储存了mysql的所以表信息,数据库名等
做分表的时候肯定是要创建新表所以这个信息数据库就很重要
SELECT COUNT(1) FROM information_schema.TABLES WHERE table_name = xxx
返回如果大于0说明表已经存在那么在逻辑判断的时候肯定就不能去建表了
返回等于0表不存在就可以去建表
CREATE TABLE ${tableName} (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
我们项目集成的mybatis xml文件里面就类似的写
而tableName是一个动态值我是根据user_id去划分30000个user_id分一个表 (可以根据自己需求修改值)
到这里基本上分表就完成了
其他的增删改查都要根据user_id计算出表名然后在xml里面sql的tableName写成动态值就可以了
其实最主要的就是 information_schema 这个信息数据库来找出数据库中是否存在相应的表,其他的sql就是要根据对应user_id计算出表名
计算表名的方法在这
public static String generateTableNameById(String tableName, long id, long shardId){
if(tables.contains(tableName)){
long num = id / shardId;
if (num == 0) {
return tableName;
}
return tableName + "_" + num;
}else{
return tableName;
}
}
大致思路就是这样