数据库:将集合与大集合进行比较

时间:2017-12-06 17:58:46

标签: mysql database indexing data-structures

如何将Set与存储在数据库中的Big Collection集合相匹配。 [该集合可能有数百万集]。

详细声明

[先决条件]集群具有特殊属性,这是一组属性。

  1. 我将获得一个具有一组属性的实体。
  2. 如果我有任何现有的集群具有完全相同的属性集(既不多也不少),那么我将该实体添加到该集群。否则,我将创建一个集群,其属性为新实体的属性集。
  3. 以上是群集的过程。 问题是我应该如何存储数据,以便系统可以在非常大的数据集上平稳运行而不会出现性能问题。

      

    我应该使用哪种数据库?在SQL或NoSQL中

    我想到了什么可能的解决方案:

    1. [MySQL]将具有群集的属性存储在表中,以便clusterId与attributeId具有m:n关系。[table cluster_attribute]。 每当一个实体来。 我们跑。
    2. 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;
      

      这会扫描很多行,导致查询速度慢。

      1. 我们将属性存储为任何字符 | 的排序连接属性,并将此列编入索引。这样我们就可以更快地查询。但是当我需要知道哪些集群具有某种特性时属性(A1),我的查询会变慢,因为我需要在mysql中使用regexp搜索。
      2. 请帮助我。

          

        更新

        1. 集合中的项目不重复。[a1,b1,c1]有效,而[a1,b1,a1,c1]则无效。
        2. 数百万套,每套数百件。

1 个答案:

答案 0 :(得分:1)

表格中有2列用于搜索。一个是精确,完整的值列表,已排序。这是一个很长的字符串,可能是TEXT。另一个是该字符串的哈希值。我可能会建议使用MD5,然后切换到32位并放入INT UNSIGNED(或BINARY(4))。 INDEX此列,但不是UNIQUE

现在,为了检查是否存在,同样使用传入的'set' - 构建字符串,并计算哈希值。在表中查找散列值。它只会给你几行,包括一些哑弹。用长串仔细检查。

WHERE hash = $hash
  AND str = '$str'

查找速度非常快。准备工作(构建排序的字符串和计算哈希)不会太困难。编写PHP代码非常容易。

注意事项:

  • 这仅适用于该集合的完全匹配。
  • 它很好地扩展。如果你有超过10亿集,那么32位散列就不够大了。 (但BIGINT和更长的BINARY会起作用。)