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

MySQL性能:嵌套插入/重复密钥与多次更新,mysql,sql,performance,sql-update,sql-insert,Mysql,Sql,Performance,Sql Update,Sql Insert,有人知道什么更高效,使用更少的资源吗 方法1-使用单个SELECT语句从一个表中获取数据,然后遍历它以在另一个表上执行多个更新。例如,伪代码、执行运行查询: 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 vi

有人知道什么更高效,使用更少的资源吗

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

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-使用单个插入。。使用嵌套的SELECT语句执行重复的键更新语句。例如:

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);
注意:表B上的ID是主键。实际上不会有任何插入,因为我知道密钥将存在。所以都是更新。只需使用此语句传入单个查询,而不是多个查询

我真的很好奇,为什么两者都会更有效率。是查询的数量决定了它的运行速度吗?瓶颈在哪里? 我正在寻找的东西,将规模每天更新的行数增长

有什么想法吗


谢谢

我想插入。。在重复密钥更新上更有效,否则,添加这样的扩展就没有多大意义了。顺便说一句,您的第一个示例与第二个示例并不完全相同-您既不使用事务也不锁定表,因此,SELECT返回的记录可能在您执行更新时不存在。

这取决于您的更新/插入比率。如果你有大量的插入,并且只比插入更新了几次。。。在重复密钥更新语句时,速度会更快

如果您主要有更新,那么最好使用UPDATE语句,如果没有更新,最好使用insert作为回退。您可以使用multi-table update子句来执行单个更新,而不是在选择之后再进行更新。如果您同时进行选择和更新,那么插入肯定会更快