我知道这个标题被滥用了,但似乎我的问题还没有回答。 所以,问题是这样的:
我有一个由四个表(表,行,列,值)组成的表结构,我用它来重新创建information_schema的行为(在某种程度上)。 在php中我生成查询以检索数据,结果仍然看起来像普通表:
SELECT
(SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
(SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2"
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1')
HAVING (col2 LIKE "%4%")
OR
SELECT * FROM
(SELECT
(SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
(SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2"
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1')) d
WHERE col2 LIKE "%4%"
请注意,我定义结果列的部分是由php脚本生成的。为什么我这样做不太重要,但我想扩展这个算法,生成查询以供更广泛的使用。
我们遇到了核心问题,我必须决定是否为查询生成where
或having
部分,我知道何时使用它们,问题是我的算法没有问题'我必须为此做一些额外的检查。但是上面的两个查询是等价的,我总是可以在子查询中添加任何查询,给它一个别名,并在新派生表上使用where。但是我想知道我是否会遇到性能方面的问题,或者这是否会以一种意想不到的方式转向我。
我知道它们是如何工作的,以及应该如何更快,但这就是我来这里问的原因。希望我能让自己明白,请原谅我的英语和长期无用的短语,以及所有这些。
编辑1
我已经知道了两者之间的区别,所有这些意味着,我唯一的困境是使用其他表中的自定义列,具有可变数字和大小,并尝试获得与使用正常创建的表相同的结果意味着我必须使用HAVING过滤派生表列,同时可以选择将其包装在子查询中并在正常情况下使用,这可能会创建一个临时表,之后将对其进行过滤。这会影响大型数据库的性能吗?不幸的是我现在无法对此进行测试,因为我无法用超过10亿个条目填充数据库(这将是这样的:rows
表中的10亿,values
表中的50亿,因为每行有5列,cols
表格中的5行和1
表格中的tables
行= 6,000,006 条目总数)
现在我的数据库看起来像这样:
+----+--------+-----------+------+
| id | name | title | dets |
+----+--------+-----------+------+
| 1 | table1 | Table One | |
+----+--------+-----------+------+
+----+-------+------+
| id | table | name |
+----+-------+------+
| 3 | 1 | col1 |
| 4 | 1 | col2 |
+----+-------+------+
where `table` is a foreign key from table `tables`
+----+-------+-------+
| id | table | extra |
+----+-------+-------+
| 1 | 1 | |
| 2 | 1 | |
+----+-------+-------+
where `table` is a foreign key from table `tables`
+----+-----+-----+----------+
| id | row | col | value |
+----+-----+-----+----------+
| 1 | 1 | 3 | 13 |
| 2 | 1 | 4 | 14 |
| 6 | 2 | 4 | 24 |
| 9 | 2 | 3 | asdfghjk |
+----+-----+-----+----------+
where `row` is a foreign key from table `rows`
where `col` is a foreign key from table `cols`
编辑2
这些条件仅用于演示目的!
编辑3
对于只有两行,似乎两者之间存在差异,使用的是0,0008,而使用的是0.0014-0.0019。我想知道这是否会影响大量行和列的性能
编辑4
两个查询的结果是相同的,即:
+----------+------+
| col1 | col2 |
+----------+------+
| 13 | 14 |
| asdfghjk | 24 |
+----------+------+
答案 0 :(得分:4)
HAVING
专门针对GROUP BY
,WHERE
是提供条件参数。另请参阅WHERE vs HAVING
答案 1 :(得分:1)
我相信在这种情况下,having子句会更快,因为你要定义特定的值,而不是读取值并寻找匹配。
答案 2 :(得分:1)
请参阅:http://database-programmer.blogspot.com/2008/04/group-by-having-sum-avg-and-count.html
基本上,WHERE
会在将列传递给聚合函数之前对其进行过滤,但HAVING
会过滤聚合函数的结果。
答案 3 :(得分:0)
你可以这样做
WHERE col2 In (14,24)
你的代码WHERE col2 LIKE "%4%"
是个坏主意,那么col2 = 34也将被选中。