【问题标题】:Count rows referring to a particular row, multiple referencing tables in MySql?计算引用特定行的行数,MySql 中的多个引用表?
【发布时间】:2018-04-19 13:21:38
【问题描述】:

我的问题如下:

正如问题"How to count amount of rows referring to a particular row foreign key in MySql?" 中所问的那样,我想计算涉及多个表的表引用,这些表引用了我感兴趣的表。但是,这里我们需要资源表每行的特定引用数。

另外,表相互引用但外键不存在的变体呢?

让我们设置一些最小的示例; 我们有三个表,这里分别称为 A、B 和 C。B 和 C 引用 A 中的行。我想统计 A 中每一行的引用总数。

第一个表 (A) 的内容,以及列 'Count' 中的预期查询结果:;

+----+------------+-------+
| ID |    Name    | Count |
+----+------------+-------+
|  1 | First row  |     0 |
|  2 | Second row |     5 |
|  3 | Third row  |     2 |
|  4 | Fourth row |     1 |
+----+------------+-------+

第二张表(B)的内容:

+----+------+
| ID | A_ID |
+----+------+
|  1 |    2 |
|  2 |    2 |
|  3 |    2 |
+----+------+

第三张表(C)的内容:

+----+------+
| ID | A_ID |
+----+------+
|  1 |    2 |
|  2 |    2 |
|  3 |    3 |
|  4 |    3 |
|  5 |    4 |
+----+------+

解决方案的重要限制

  1. 该解决方案应与n 表一起使用,以获得n 的合理值。该示例有n=2
  2. 解决方案不应涉及所有表的产品集的子集。由于 A 中的某些行可能在所有其他表中被多次引用,因此产品集的大小可能非常大(例如 10*10*10*... 很快就会变大)。例如。它可能不是O(q^n),其中n 是表数,q 是出现次数。

【问题讨论】:

  • "它可能不是O(q^n),其中 n 是表的数量,q 是出现的数量。" 由于 MySQL,很难计算出 SQL 查询的运行时间复杂度优化器和可能更改的查询计划..“它可能不是O(q^n),其中 n 是表的数量”听起来您不了解 SQL 的工作原理或您不思考逻辑。如果您定义多个表,那么您需要命名是合乎逻辑的SQL 查询中的那些表..
  • 我的意思是当你做一个简单的 JOIN 时,mySQL 将与每个连接相乘。例如。如果表 B 有两行与 A 匹配,而 C 有三行,则将两者联接将产生 6 行。这发生在任何计数之前。因此,如果您加入 30 个表,如果每个表 A 中的特定行有 10 行,则结果中可以得到 10^30 行。显然,这是一个问题。因此限制;这意味着您不能先聚合,然后再删除重复项,因为它太昂贵了。

标签: mysql performance


【解决方案1】:

这是一个部分解决方案,我认为它仍然存在与条件相关的性能问题 [2]

我将其添加为答案,因为它可能对那些致力于寻求更好解决方案的人有用

应用以下查询。根据需要扩展附加表,向总和和 JOIN 集添加附加行。只要您的表少于大约 90 个,这个特定的解决方案就可以工作。除此之外,您将不得不运行多个类似的查询并缓存结果(例如通过在“A”表中创建一列),然后将所有这些汇总起来。

SELECT  
    COUNT(DISTINCT B.ID) + 
    COUNT(DISTINCT C.ID) -- + .....
    AS `Count` 
FROM A
    LEFT JOIN B ON A.ID = B.A_ID
    LEFT JOIN C ON A.ID = C.A_ID

不幸的是,如果您经常引用行,查询将产生大量中间结果,内存不足,因此永远无法完成。

【讨论】:

  • 在使用 JOIN 时不要忘记添加索引,否则性能也会非常糟糕,并且还会导致更高的运行时间复杂度
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
相关资源
最近更新 更多