如果更新失败,MySQL函数插入记录?

时间:2009-01-21 18:03:12

标签: optimization mysql

我目前正在处理的部分系统涉及登录mysql,计数经常更新。

插入的数据格式为:

   date    | name | count |
-----------+------+-------+
2009-01-12 | alan |   5   |
2009-01-12 | dave |   2   |
2009-01-12 | mary |   1   |

此数据定期从平面文件中解析,总结如上,为数据库插入/更新做准备 - 数据库上的唯一键是(date, name)对。

以前,在决定更新或插入之前,此系统会检查现有表格中是否有给定datename对的任何记录。

我们遇到的问题是,随着此表的增长,响应时间没有变得更好,我们希望尽可能减少查询数量。

最近更新了系统以运行INSERT ... ON DUPLICATE KEY UPDATE查询,该查询略微减少了select s的数量,但我们常见的情况是update

我想知道是否有人知道一个基本上INSERT ... ON DUPLICATE KEY UPDATE反向的mysql函数,即如果没有匹配则尝试更新一行,然后执行插入?

<小时/> 的修改

我上面没有说清楚,例如,当我有记录('2009-01-12','alan','5')时,我想做的是:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan';

如果上述操作失败,请插入以上数据。增加计数器的必要性是REPLACE不起作用的原因。替换执行删除&amp;插入,并且不允许您引用要删除的行,因此count = count + 5不会将之前的count值增加5。

@jasoncohen - INSERT ... ON DUPLICATE KEY UPDATE确实可以胜任,但我在问是否有更优化的方法可以做到这一点。

对于由于原始措辞不佳而导致的任何混淆感到抱歉!

4 个答案:

答案 0 :(得分:3)

它是一样的。使用“UPDATE ... ON NO KEY INSERT”,数据库引擎仍然必须首先检查是否有更新内容。因此,即使更新是最常见的,也不需要单独的构造

答案 1 :(得分:2)

答案 2 :(得分:1)

我一直试图弄清楚你想要的是什么,而且正如我所看到的,如果数据匹配,你不想做任何事情?我没有看到解决方案,如果“计数”会以某种方式改变并需要更新,那么你就会坚持使用INSERT INTO ON DUPLICATE KEY UPDATE(我实际上并没有看到问题)。

但是,如果计数永远不会更新,您可能需要查看INSERT IGNORE INTO,如果唯一键(日期+名称)已经存在,它将忽略插入。

您没有考虑“冲洗/旋转”您的平面文件,仅检查添加的材料?或者不可能?

编辑:

由于重复密钥冲突,INSERT将立即失败,并在这种情况下触发UPDATE。根本不应该是任何性能问题。我一直在相当大的数据库上执行此操作,并且从空数据库开始而不是已经填充的数据库时,我没有注意到任何巨大的性能差异。

但是,为了保持索引的良好状态,不时运行ANALYZE TABLE / OPTIMIZE TABLE可能是件好事。

答案 3 :(得分:0)

为什么INSERT不足够?即使大多数时候它是一个重复的键,因此是一个更新(而不是相反),它仍然是正确的操作吗?

您只是在询问性能问题吗?