老大今天说,要规划一下分表了,预防在以后数据量上来的时候,保持查询效率。
只好先看看分表的相关文章了。对了,这里有提到分表后,如何处理ID自增的解决方案 http://blog.sae.sina.com.cn/archives/1284
好了,那么到底该如何处理?如果我们知道了主键,如何快速查找相关的表名?
(先说说现在的表状况:业务表A,现在是有自增主键,而且引擎是InnoDB;分表是用定时任务,到凌晨的时候,检查最大的主键,如果主键>XXXW的时候,分表)
1、ID自增的问题已经解决了。
2、到需要解决的问题了:如何根据主键大小获取表名?
现在想到的解决方案是:
1)、建立一个分表状态表:
CREATE TABLE `point_status` (
maxID int(11) default 0,
tableName varchar(20),
unique key(tableName)
) ENGINE=InnoDB ;
2)、用带查询的主键,与状态表的数据比较,得出相关的表名。
最后,java的实现:【存在问题,不要参考~】
<pre name="code" class="java">/**
* 根据主键大小,找出相关的表
* @param list 分表状态(从主键大->小排序)
* @param key 待校验主键
* @return 主键所在表名索引
*/
private static int getIndex(List<Integer> list,int key){
int high = 0;
int low = list.size();
boolean isHighAdd = false;
boolean isLowMinues = false;
while(high<low){
int mid = (high + low) /2;
if(key == list.get(mid)){
return mid;
}
if(key<list.get(mid)){
high = mid + 1;
isHighAdd = true;
}
if(key>list.get(mid)){
low = mid - 1;
isLowMinues = true;
}
}
if(!isHighAdd && isLowMinues){
return -1;
}
if(high==low){
if(isHighAdd && isLowMinues){
return (high+low)/2;
}
return high-1;
}
return 0;
}