如何将Set与存储在数据库中的Big Collection集合相匹配。 [该集合可能有数百万集]。
[先决条件]集群具有特殊属性,这是一组属性。
以上是群集的过程。 问题是我应该如何存储数据,以便系统可以在非常大的数据集上平稳运行而不会出现性能问题。
我应该使用哪种数据库?在SQL或NoSQL中
m:n
关系。[table cluster_attribute]。
每当一个实体来。
我们跑。 select clusterId,count(1) from cluster_attribute where attributeId in("comma separated IDs of attributes");
但这不会很好,因为我们可能会找到一个完整填充上述查询的一长串clusterId。
在上面的表格中,我们执行类似。
的查询select clusterId,count(1) cnt from cluster_attributes a
inner join cluster_attributes b on a.cluesterId=b.cluesterId
where b.attributeId in("comma separated IDs of attributes")
group by clusterId
having cnt = @sizeOfEntityAttributeSet;
这会扫描很多行,导致查询速度慢。
请帮助我。
更新
[a1,b1,c1]
有效,而[a1,b1,a1,c1]
则无效。答案 0 :(得分:1)
表格中有2列用于搜索。一个是精确,完整的值列表,已排序。这是一个很长的字符串,可能是TEXT
。另一个是该字符串的哈希值。我可能会建议使用MD5,然后切换到32位并放入INT UNSIGNED
(或BINARY(4)
)。 INDEX
此列,但不是UNIQUE
。
现在,为了检查是否存在,同样使用传入的'set' - 构建字符串,并计算哈希值。在表中查找散列值。它只会给你几行,包括一些哑弹。用长串仔细检查。
WHERE hash = $hash
AND str = '$str'
查找速度非常快。准备工作(构建排序的字符串和计算哈希)不会太困难。编写PHP代码非常容易。
注意事项:
BIGINT
和更长的BINARY
会起作用。)