【分表查询】根据主键大小获取表名

18 篇文章 0 订阅
6 篇文章 0 订阅

老大今天说,要规划一下分表了,预防在以后数据量上来的时候,保持查询效率。


只好先看看分表的相关文章了。对了,这里有提到分表后,如何处理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;
	}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值