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

Posted

技术标签:

【中文标题】MySQL 性能:嵌套插入/重复键与多次更新【英文标题】:MySQL performance: nested insert/duplicate key vs multiple updates 【发布时间】:2010-09-20 18:18:52 【问题描述】:

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

方法 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 语句。例如:

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

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

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于MySQL 性能:嵌套插入/重复键与多次更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用嵌套查询插入或更新

Mysql算法内部算法 - 嵌套循环连接算法

使用 Python 将嵌套列表插入 mysql 数据库

如果值不存在,将值插入 MySQL 表?

Google BigQuery - 更新嵌套的重复字段

mongodb更新比较频繁,性能下降的厉害怎么办