使用“COMB(Combine)”类型设计思路

2021-10-08 15:06:45 浏览数 (1)

使用“COMB(Combine)”类型   COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1毫秒,时间4095年,两个COMB类型数据完全相同的可能性是在这1毫秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!注意这16字节转化为16进制再转化为字符串存储时也是32字节。   首先,MySQL时间戳timestamp是采用int存储,4个字节,最多32位,可以从1970年1月1日00:00:00一直到2037年,精度为一秒,其值作为数字显示。   下面说明:6个字节的时间精度问题,6字节共48位

  那么精度为毫秒,可以用4095年,算上0可以用4096年。 其实可以直接用System.currentTimeMillis()获取当前时间距离1970年1月1日0点0分0秒的毫秒数,然后转化为16进制,可以表示到10889年,

代码语言:javascript复制
`import java.util.UUID;

/**
 * 
 * @author xie 由于randomUUID()方法生成的uuid除了4个版本位:49-52位,
 * 2个变体位(表示uuid的显示形式,即-在哪个位置,8-4-4-4-12 Java默认的,当然还有其他的形式):65-66位,
 * 都是为了随机而产生的比如,伪随机数,MAC地址等,我们替换第1-48位,保证主键尽量有序,还不删掉有用信息
 */
public class Main {
public static void main(String[] args) throws Exception {
	long nowTime = System.currentTimeMillis();
	System.out.println(nowTime   "");
	String uuid = UUID.randomUUID().toString().replaceAll("-", "");
	System.out.println(uuid   "");
	String now16 = Long.toHexString(nowTime);
	System.out.println(now16   "");
	StringBuffer str = new StringBuffer(uuid);
	int length = now16.length();
	if (length <= 12) {
		str.replace(0, 12 - length, "0");
		System.out.println(str.replace(12 - length, 12, now16).toString());// 这么设定是为了生成的uuid字符串还是32字节
	} else {
		throw new Exception("时间超出10889年,请重新设计主键!");
	}
}

}`

索引的类型

索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每种存储引擎的索引都不一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

0 人点赞