在对更新字段进行计算时更新表更有效

时间:2016-01-05 10:11:05

标签: java mysql performance calculated-field

我想更新一个给定值为X的表。但更新涉及一些计算。这是查询(在mysql中):

INSERT INTO table_X (
  id,
  type,
  count,
  last,
  sum,
  ssq,
  date
) VALUES (
  #{id},
  #{type},
  1,
  #{X},
  #{X},
  #{X} * #{X},
  now()
)
ON DUPLICATE KEY UPDATE
  count = count+1,
  last= #{X},
  sum = sum + #{X},
  ssq = ssq + #{X} * #{X},
  date = now()

从Java上下文调用查询。在不同的id上执行它需要大约16-18秒。

现在,当我运行查询但使用固定变量而不是获取旧变量并使用它们进行计算时(例如ssq = ssq + #{X} * #{X} - > ssq = 5),它只需要8秒!这是一项重大改进。

它给了我在Java中进行计算的想法。为此,我(我想)需要先选择标识为#{id}的记录,然后进行计算,然后更新表格。但是因为我现在需要两次访问该表所需的时间超过30秒。

有没有人知道是否有更好的方法来更新表格并在其自己的字段上进行计算?

1 个答案:

答案 0 :(得分:0)

您必须进行2次更改: 1.将#{X}改为VALUES(fieldname),如VALUES(sum) 2.在一个INSERT语句中放入更多ROWS(1000或更多)

INSERT INTO table_X (
  id, type, count, last,
  sum, ssq, date
) VALUES 
( -- Values for ROW 1
  #{id},  #{type}, 1,
  #{X},  #{X}, #{X} * #{X},
  now()
),
( -- Values for ROW 2
  #{id},  #{type}, 1,
  #{X},  #{X}, #{X} * #{X},
  now()
),
( -- Values for ROW 3
  #{id},  #{type}, 1,
  #{X},  #{X}, #{X} * #{X},
  now()
)
ON DUPLICATE KEY UPDATE
  count = count+1,
  last= VALUES(last),
  sum = sum + VALUES(sum),
  ssq = ssq + VALUES(ssq) * VALUES(ssq),
  date = now();