MySQL性能:嵌套插入/重复密钥与多个更新

时间:2010-09-20 18:18:52

标签: mysql sql performance sql-update sql-insert

有谁知道什么会更有效率并且使用更少的资源:

方法1 - 使用单个SELECT语句从一个表中获取数据,然后迭代它以在另一个表上执行多个UPDATE。例如。 (伪代码,execute()运行查询):

Query1_resultset = execute("SELECT item_id, sum(views) as view_count FROM tableA WHERE condition=1");  
while(Query1_resultset as row) {  
   execute("UPDATE tableB SET view_count=row.view_count WHERE id=row.item_id");  
}


方法2 - 使用单个INSERT .. ON DUPLICATE KEY UPDATE语句和嵌套的SELECT语句。 E.G:

INSERT INTO tableB (id, view_count) SELECT item_id, SUM(views) as view_count FROM tableA WHERE condition=1 ON DUPLICATE KEY UPDATE view_count=VALUES(view_count);

注意:tableB上的ID是主键。实际上不会有任何INSERTS,因为我知道密钥将存在。所以这都是UPDATE。只使用此语句传递单个查询而不是多个查询。

我真的好奇为什么要么效率更高。是确定运行速度的查询数量是多少?瓶颈在哪里? 我正在寻找可扩展的东西(每天更新的行数增加)。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

它取决于您的更新/插入比率。如果你有很多插入,只有一些更新比INSERT ... ON DUPLICATE KEY UPDATE语句更快。

如果你主要有更新,那么你最好使用UPDATE语句和插入作为后备(如果没有更新)。您可以使用多表更新子句来执行单个更新,而不是选择后跟更新。如果您同时执行SELECTUPDATEINSERT肯定会更快。

答案 1 :(得分:0)

我认为INSERT.. ON DUPLICATE KEY UPDATE更有效率(否则,添加此类扩展名没有多大意义)。顺便说一下,你的第一个例子与第二个例子不完全相同 - 你既不使用事务也不锁定表,所以SELECT返回的记录可能在你执行UPDATE时不存在{{} 1}}。