计算引用特定行的行,MySql中的多个引用表?

时间:2018-04-19 13:21:38

标签: mysql performance

我的问题如下:

正如问题"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是出现的数量。

1 个答案:

答案 0 :(得分:0)

这是一个部分解决方案,我认为仍然会遇到与条件相关的性能问题[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

不幸的是,如果你经常引用行,那么查询将产生一个巨大的中间结果,内存不足,因此永远不会完成。