我们的数据是保密的,因此我在这里创建虚拟数据。记录数量为10万。
表1表格:
+------------------+
| formID formName |
+------------------+
| 1 student |
| 2 teacher |
+------------------+
表2字段:
+--------------------+
| fieldID fieldName |
+--------------------+
| 1 Name |
| 2 Location |
+--------------------+
Table3 FormField:
+----------------------------+
| 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分钟,这是不可接受的。
答案 0 :(得分:3)
我的要求是支持无限的动态字段
这不起作用。固定数量的字段非常可行,但每增加一个字段会降低性能,但是未知的动态数字很难处理。
SELECT frm.formName,
frmfld1.Value AS Name,
frmfld2.Value AS Location
FROM Form frm
LEFT OUTER JOIN FormField frmfld1 ON frmfld1.formID = frm.formID AND frmfld1.fieldID = 1
LEFT OUTER JOIN FormField frmfld2 ON frmfld2.formID = frm.formID AND frmfld2.fieldID = 2
确保您拥有Form(formID)
和FormField(formID, fieldID)
上的索引。
答案 1 :(得分:0)
规范化数据库越多,获取成本就越高。这意味着您需要加入更多表。所以在这里你有同样的问题。
我建议使用视图,这将有助于您达到某种程度。但这不是长期解决方案。另一个选择是,如果你能提供'哪里有'索引列的条件。这真的很有帮助。
答案 2 :(得分:0)
http://sqlfiddle.com/#!9/013eb2/3
SELECT frm.formName,
GROUP_CONCAT(IF(frmfld.fieldID=1,frmfld.Value,NULL)) AS Name,
GROUP_CONCAT(IF(frmfld.fieldID=2,frmfld.Value,NULL)) AS Location
FROM Form frm
LEFT JOIN FormField frmfld
ON frmfld.formID = frm.formID
GROUP BY frm.formID