【发布时间】:2015-09-11 12:29:03
【问题描述】:
我们的数据是机密的,因此我在这里创建虚拟数据。记录数为 100 000。
Table1 表格:
+------------------+
| formID formName |
+------------------+
| 1 student |
| 2 teacher |
+------------------+
Table2 字段:
+--------------------+
| fieldID fieldName |
+--------------------+
| 1 Name |
| 2 Location |
+--------------------+
Table3 表单域:
+----------------------------+
| formID fieldID Value |
+----------------------------+
| 1 1 studentName |
| 1 2 ahmedabad |
| 2 1 teacherName |
| 2 2 mumbai |
+----------------------------+
我的查询:
select frm.formName,
(
select frmfld.Value from FormField frmfld
WHERE frmfld.fieldID = 1 AND frmfld.formID = frm.formID
) AS Name,
(
select frmfld.Value from FormField frmfld
WHERE frmfld.fieldID = 2 AND frmfld.formID = frm.formID
) AS Location
From Form frm
在这里,字段可能会动态增加,对于该字段,我们每次都在使用代码库创建查询时附加新的子查询部分。随着此字段增长到 100,此查询的执行时间由于子查询而增长到 7 到 8 分钟,这是不可接受的。
【问题讨论】:
-
提供
EXPLAIN的输出,提供你的MySQL配置变量,提供你的服务器硬件信息。您正在使用 EAV 结构,并且根据您所做的判断 - 它很可能设计得更好。另外,什么是 1lac?我从来没有见过,你有没有机会把它转换成公制单位? -
你不需要那些子查询。简单的
JOINs 就可以了。 -
我不能分享解释的输出,因为它是机密的,我上面分享的内容是假的。如果您对这种结构有更好的设计,那么欢迎您的建议。 @Mjh:1 lac 表示 100k。
-
@HannoBinder :简单的连接在这里没有用,因为我需要将数据从行转换为列。
-
您发布的查询只能使用
JOINs 完全复制。您还有其他没有提到的要求吗?