2009-01-21 36 views
8

目前我正在使用的系统的一部分涉及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

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


编辑

我没有做它上面的太清楚,我想,当我有记录('2009-01-12','alan','5')例如做什么,就是:

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

,如果上面的失败,插入上面的数据。增加计数器的需要是为什么REPLACE不起作用。更换执行删除操作&插入,并且不会让你指的是该行被删除,所以count = count + 5不会增加由5

@jasoncohen以前count值 - INSERT ... ON DUPLICATE KEY UPDATE不会做的工作,但我我问是否有更好的方法来做到这一点。

对不起原始措辞造成的任何混淆!

回答

3

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

+0

有道理,希望得到更多的希望比期望有一些神奇的,超级执行的MySQL查询! – ConroyP 2009-01-25 20:51:15

0

为什么INSERT不够?即使大多数情况下它是重复密钥,因此是更新(而不是其他方式),它仍然是正确的操作权限?

你只是要求关注性能吗?

1

我一直在试图弄清楚你想要什么样的极端,而且正如我所看到的,如果数据匹配,你不想做任何事情?我没有看到一个解决方案,如果“计数”以某种方式将改变,并需要更新,你坚持INSERT INTO ON DUPLICATE KEY UPDATE(我真的不明白这个问题)。但是,如果计数永远不会更新,那么您可能想要查看INSERT IGNORE INTO,如果唯一键(date + name)已经存在,它将忽略插入。

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

编辑:

的INSERT将立即失败,因为重复键冲突,并引发在这种情况下,UPDATE。根本不应该有任何性能问题。我在非常大的数据库上一直这样做,从空数据库开始而不是已经填充的数据库时,我没有注意到任何巨大的性能差异。

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

相关问题