有谁知道什么会更有效率并且使用更少的资源:
方法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。只使用此语句传递单个查询而不是多个查询。
我真的好奇为什么要么效率更高。是确定运行速度的查询数量是多少?瓶颈在哪里? 我正在寻找可扩展的东西(每天更新的行数增加)。
有什么想法吗?
由于
答案 0 :(得分:2)
它取决于您的更新/插入比率。如果你有很多插入,只有一些更新比INSERT ... ON DUPLICATE KEY UPDATE
语句更快。
如果你主要有更新,那么你最好使用UPDATE
语句和插入作为后备(如果没有更新)。您可以使用多表更新子句来执行单个更新,而不是选择后跟更新。如果您同时执行SELECT
和UPDATE
,INSERT
肯定会更快。
答案 1 :(得分:0)
我认为INSERT.. ON DUPLICATE KEY UPDATE
更有效率(否则,添加此类扩展名没有多大意义)。顺便说一下,你的第一个例子与第二个例子不完全相同 - 你既不使用事务也不锁定表,所以SELECT
返回的记录可能在你执行UPDATE
时不存在{{} 1}}。