做个md5查询站(3)数据格式

上次的测试显示:当数据达到1,679,062时,整个primary的文件达到了176M。

也就是说,每一万数据1M,10条数据1K,1条数据100字节,

反向算一下,一条数据由一个32位字符串和一个16位字符串及各自相应的两个字符构成,估且算做8位,那么,

一条数据占有空间应该不少于:32+16+8x2=64,如果再加上字段与记录的分隔符的话,应该有70字节以上。

加上索引和primary中的各种其它信息,差不多了吧。

这时候就会想到:char字段实在是太浪费空间了。

根据MD5码的特点,还是用最原始的方案:二进制(binary)来保存数据。

MD5本身就是一个16进制的字符串,以二进制保存应该是最省空间的做法了,一个进六进制数,比如“A”,以char保存的话要用掉一个字节,也就是8bytes,而如果以二进制保存的话,编码为1010,只用了4bytes,如此一来,密文的存储量降低了一倍。

再者:三位的所有数据加起来已达到830,584条{(26+26+32+10)的3次方},83万如果按原来的方法存储,可能要用掉90M的空间。

这时如果明文字段可以用char(3)来代替原来的char(8),也能省去不少的空间。

这样算下来,一条数据占有的空间变为:16+8+3x2=30,少了一半,。

于是建表:

CREATE TABLE [dbo].[MD516](
 
[md5hash] [binary](8NOT NULL,
 
[md5key] [char](3NOT NULL,
 
CONSTRAINT [PK_MD516] PRIMARY KEY CLUSTERED 
(
 
[md5hash] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]
ON [PRIMARY]

CREATE TABLE [dbo].[MD532](
 
[md5hash] [binary](16NOT NULL,
 
[md5key] [char](3NOT NULL,
 
CONSTRAINT [PK_MD532] PRIMARY KEY CLUSTERED 
(
 
[md5hash] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]
ON [PRIMARY]

写入数据的部分略掉了,最后将3位以下的所有组合都入库了。

整个数据库60M,有839,514条记录。总算是比最初的设计小了一些了,但是如果要录入四位的,约有8千万,单表已经乏力,下回再说分表那点事。

原文地址:https://www.cnblogs.com/fhmsha/p/1335981.html