动态字段插入的MySQL查询性能

时间:2015-09-11 12:29:03

标签: java mysql

我们的数据是保密的,因此我在这里创建虚拟数据。记录数量为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分钟,这是不可接受的。

3 个答案:

答案 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