【发布时间】:2013-07-30 14:04:25
【问题描述】:
我知道这个标题被过度使用了,但我的问题似乎还没有得到回答。 所以,问题是这样的:
我有一个由四个表(表、行、列、值)组成的表结构,我用它们来重新创建 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%")
或
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 过滤派生表列,同时可以选择将其包装在子查询中并正常使用 where,这可能会创建一个临时表,之后将被过滤。这会影响大型数据库的性能吗?不幸的是,我现在无法对此进行测试,因为我负担不起用超过 10 亿个条目填充数据库(这将是这样的:rows 表中有 10 亿个,values 表中有 50 亿个,每行cols 表中有 5 列 5 行,tables 表中有 1 行 = 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
只有两行,两者之间似乎存在差异,使用have的是0,0008,使用where的是0.0014-0.0019。我想知道这是否会影响大量行和列的性能
编辑 4
两次查询的结果是一样的,即:
+----------+------+
| col1 | col2 |
+----------+------+
| 13 | 14 |
| asdfghjk | 24 |
+----------+------+
【问题讨论】: