繁体   English   中英

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

[英]MySQL performance: nested insert/duplicate key vs multiple updates

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

方法1 - 使用单个SELECT语句从一个表中获取数据,然后迭代它以在另一个表上执行多个UPDATE。 EG(伪代码,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语句。 例如:

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。 只使用此语句传递单个查询而不是多个查询。

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

有任何想法吗?

谢谢

它取决于您的更新/插入比率。 如果你有很多插入,只有两个更新而不是INSERT ... ON DUPLICATE KEY UPDATE语句会更快。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM