我目前正在处理的部分系统涉及登录mysql,计数经常更新。
插入的数据格式为:
date | name | count |
-----------+------+-------+
2009-01-12 | alan | 5 |
2009-01-12 | dave | 2 |
2009-01-12 | mary | 1 |
此数据定期从平面文件中解析,总结如上,为数据库插入/更新做准备 - 数据库上的唯一键是(date, name)
对。
以前,在决定更新或插入之前,此系统会检查现有表格中是否有给定date
和name
对的任何记录。
我们遇到的问题是,随着此表的增长,响应时间没有变得更好,我们希望尽可能减少查询数量。
最近更新了系统以运行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
确实可以胜任,但我在问是否有更优化的方法可以做到这一点。
对于由于原始措辞不佳而导致的任何混淆感到抱歉!
答案 0 :(得分:3)
它是一样的。使用“UPDATE ... ON NO KEY INSERT”,数据库引擎仍然必须首先检查是否有更新内容。因此,即使更新是最常见的,也不需要单独的构造
答案 1 :(得分:2)
使用REPLACE功能:
答案 2 :(得分:1)
我一直试图弄清楚你想要的是什么,而且正如我所看到的,如果数据匹配,你不想做任何事情?我没有看到解决方案,如果“计数”会以某种方式改变并需要更新,那么你就会坚持使用INSERT INTO ON DUPLICATE KEY UPDATE(我实际上并没有看到问题)。
但是,如果计数永远不会更新,您可能需要查看INSERT IGNORE INTO,如果唯一键(日期+名称)已经存在,它将忽略插入。
您没有考虑“冲洗/旋转”您的平面文件,仅检查添加的材料?或者不可能?
编辑:
由于重复密钥冲突,INSERT将立即失败,并在这种情况下触发UPDATE。根本不应该是任何性能问题。我一直在相当大的数据库上执行此操作,并且从空数据库开始而不是已经填充的数据库时,我没有注意到任何巨大的性能差异。
但是,为了保持索引的良好状态,不时运行ANALYZE TABLE / OPTIMIZE TABLE可能是件好事。
答案 3 :(得分:0)
为什么INSERT
不足够?即使大多数时候它是一个重复的键,因此是一个更新(而不是相反),它仍然是正确的操作吗?
您只是在询问性能问题吗?