目前遇到问题了。想提升查询速度。
目前的数据库中有500万条数据
表结构如下:
CREATE TABLE [dbo].[hm_tb] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[hm1] [int] NULL ,
[hm2] [int] NULL ,
[hm3] [int] NULL ,
[hm4] [int] NULL
) ON [PRIMARY]
GO
其中hm1-hm4代表的是hash字符串。字符总长度为64位。分成4块来存储。
每个块存储16位长度的二进制数据。我表中转换为INT类型。
查询相关:
比如得到一个HASH为:1010100111100011010101010111110001110101100010110101001110011101
先分成4段:
1段:1010100111100011 = 43491
2段:0101010101111100 = 21884
3段:0111010110001011 = 30091
4段:0101001110011101 = 21405
每段为16位长度转化为对应的十进制
计算汉明距离的方法:
select * from hm_tb where bit_count(hm1^43491)+bit_count(hm2^21884)+bit_count(hm3^30091)+bit_count(hm4^21405)<=4
其中bit_count函数和MYSQL中的bit_count类似就是计算一个数字中二进制里面1的个数。
这样就可以得到相似度在93.7%以上的数据。
经计算500万条要1分多种才出结果。这时间太久了。
请问大家有没有好的解决方案。
先从表结构以及能用到的索引方面来讨论一下(貌似这种计算是全表扫描,没地方建索引)。
硬件方面暂时先不讨论。