【发布时间】: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 |
+----+------+
解决方案的重要限制
- 该解决方案应与
n表一起使用,以获得n的合理值。该示例有n=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