3

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

方法 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 因为我知道密钥会存在。所以这都是更新。只需使用此语句传入单个查询而不是多个。

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

有任何想法吗?

谢谢

4

2 回答 2

2

这取决于您的更新/插入比率。如果你有很多插入并且只有几个更新,那么INSERT ... ON DUPLICATE KEY UPDATE语句会更快。

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

于 2010-09-20T18:29:22.423 回答
0

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

于 2010-09-20T18:26:20.990 回答