[英]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
语句和插入作为回退(如果没有更新)会更好。 您可以使用多表更新子句来执行单个更新,而不是选择后跟更新。 如果你同时执行SELECT
和UPDATE
,那么INSERT
肯定会更快。
我认为INSERT.. ON DUPLICATE KEY UPDATE
效率更高(否则,添加这样的扩展名没有多大意义)。 顺便说一句,你的第一个例子与第二个例子不完全相同 - 你既不使用事务也不锁定表,因此在执行UPDATE
时, SELECT
返回的记录可能不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.