`
luowei925
  • 浏览: 8126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL replace与insert on duplicate效率分析

阅读更多
replace

这是mysql自身的一个语法,使用replace的时候。其语法为:

replace into tablename (f1, f2, f3) values(vf1, vf2, vf3),(vvf1, vvf2, vvf3)
这中语法会自动查询主键或索引冲突,如有冲突,他会先删除原有的数据记录,然后执行插入新的数据。

insert on duplicate key.

这也是一种方式,mysql的insert操作中也给了一种方式,语法如下:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;
在insert时判断是否已有主键或索引重复,如果有,一句update后面的表达式执行更新,否则,执行插入。

第一种方式不说了,replace和insert on duplicate key这两种方式,哪中效率更高一些呢,毕竟,我们的执行sql,追求的就是高效。

分析

在最终实践结果中,得到接过如下:
在数据库数据量很少的时候, 这两种方式都很快,无论是直接的插入还是有冲突时的更新,都不错,但在数据库表的内容数量比较大(如百万级)的时候,两种方式就不太一样了,

首先是直接的插入操作,两种的插入效率都略低, 比如直接向表里插入1000条数据(百万级的表(innodb引擎)),二者都差不多需要5,6甚至十几秒。究其原因,我的主机性能是一方面,但在向大数据表批量插入数据的时候,每次的插入都要维护索引的, 索引固然可以提高查询的效率,但在更新表尤其是大表的时候,索引就成了一个不得不考虑的问题了。

其次是更新表,这里的更新的时候是带主键值的(因为我是从另一个表获取数据再插入,要求主键不能变) 同样直接更新1000条数据, replace的操作要比insert on duplicate的操作低太多太多, 当insert瞬间完成(感觉)的时候,replace要7,8s, replace慢的原因我是知道的,在更新数据的时候,要先删除旧的,然后插入新的,在这个过程中,还要重新维护索引,所以速度慢,但为何insert on duplicate的更新却那么快呢。 在向老大请教后,终于知道,insert on duplicate 的更新操作虽然也会更新数据,但其对主键的索引却不会有改变,也就是说,insert on duplicate 更新对主键索引没有影响.因此对索引的维护成本就低了一些(如果更新的字段不包括主键,那就要另说了)。

题外话:

在向大数据的表里批量插入(纯插入,不更新)的时候, 随着插入的数量越来越多,会导致越来越慢,这中情况下,因为我们用的innodb表, 有的说使用事务可以增加效率,但执行变化一般,有待考证。

还有说明一下: 当我们执行数据库的插入和更新操作很慢的时候,不仅仅是语句,主机性能也很重要, 比如内存和cpu, 如果是虚拟机要相应适当调整, 如果在各种优化了之后效率还是很低, 但cpu和内存的占用却不高,那么就很可能是磁盘的IO性能了,这也会导致数据的更新速度慢。
分享到:
评论

相关推荐

    MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    MySQL中的`REPLACE INTO`和`INSERT INTO ... ON DUPLICATE KEY UPDATE`是两种处理数据冲突的方法,它们在处理已有键值冲突时的行为有所不同。这两种语句都是在插入新记录时,如果发现存在相同的唯一键值,则采取不同...

    mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析

    在MySQL中,`REPLACE INTO` 和 `INSERT INTO ON DUPLICATE KEY UPDATE` 是两种处理数据插入时冲突的方法,主要用于处理当试图插入一条记录,而该记录的唯一键或主键已经在表中存在的情况。这两种方法都可以实现如果...

    MySQL中如何处理重复数据(Duplicate)?

    MySQL 中处理重复数据(Duplicate)的主要方式是使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句或 REPLACE INTO 语句。下面是这两种方法的详细解释: 一、INSERT INTO ... ON DUPLICATE KEY UPDATE 语句 ...

    MYSQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例

    MySQL中的`REPLACE`和`ON DUPLICATE KEY UPDATE`语句是处理数据插入时可能出现的唯一键冲突的有效方法。这两个语句主要用于更新已有记录或在出现冲突时替换原有记录。 **1. REPLACE语句** `REPLACE`语句在表中具有...

    mysql 批量更新及效率对比

    MySQL 批量更新的高效方法 MySQL 批量更新是指在 MySQL 数据库中批量更新多... On Duplicate Key Update 语句可以大大提高更新效率,而使用临时表的方法也可以提高效率,但是需要用户有 temporary 表的 create 权限。

    mysql ON DUPLICATE KEY UPDATE语句示例

    在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在插入新数据时,如果遇到重复的唯一键值,自动执行更新操作,而不是抛出错误。这个功能大大简化了数据处理的流程,特别是当你需要在一...

    MySQL replace into 用法.txt

    根据提供的文件信息,本文将详细解释 MySQL 中 `REPLACE INTO` 的使用方法及特性,并对比其与 `INSERT INTO` 的不同之处。 ### MySQL REPLACE INTO 介绍 #### 1. REPLACE INTO 的基本概念 `REPLACE INTO` 是 ...

    insert into … on duplicate key update / replace into 多行数据介绍

    ON DUPLICATE KEY UPDATE` 和 `REPLACE INTO` 是MySQL中处理批量插入并更新已有数据的两种有效策略,它们提供了在保持数据完整性和性能之间平衡的解决方案。根据具体业务需求和数据约束,选择合适的方法来优化数据...

    mysql 批量更新及效率对比.docx

    Replace Into 和 Insert Into On Duplicate Key Update 两种方法都可以实现批量更新,但它们之间有着很大的区别。 Replace Into 操作本质是对重复的记录先 delete 后 insert,如果更新的字段不全会将缺失的字段置为...

    完美解决Thinkphp3.2中插入相同数据的问题

    本文将详细探讨如何在ThinkPHP 3.2版本中处理插入重复数据的问题,以及MySQL中的两种解决方案——`ON DUPLICATE KEY UPDATE` 和 `REPLACE INTO`。 首先,我们需要理解问题背景。在使用ThinkPHP 3.2进行数据插入时,...

    Mysql中replace与replace into的用法讲解

    而 `REPLACE` 的效率相比 `INSERT IGNORE` 或 `INSERT ON DUPLICATE KEY UPDATE` 在某些情况下可能会更高,因为它不需要检查每一行是否存在冲突,而是直接进行替换。 总结来说,`REPLACE` 和 `REPLACE INTO` 是...

    MySQL Replace INTO的使用

    MySQL中的`REPLACE INTO`语句是一个非常有用的命令,它的工作方式类似于`INSERT`,但带有一种自动删除和替换的功能。当试图插入的数据与表中已存在的唯一索引(包括 PRIMARY KEY 或 UNIQUE 索引)冲突时,`REPLACE ...

    MySql三种避免重复插入数据的方法

    当遇到主键或唯一键冲突的情况,有三种主要的插入方法可以帮助我们避免重复数据,分别是`INSERT IGNORE`、`REPLACE INTO`和`INSERT ON DUPLICATE KEY UPDATE`。下面我们将详细探讨这三种方法的用法及其区别。 1. **...

    MySQL使用Replace操作时造成数据丢失的问题解决

    MySQL中的`REPLACE`操作是一个功能强大的命令,它结合了`INSERT`和`DELETE`的功能。当执行`REPLACE`时,如果新插入的行与表中已存在的行在主键或唯一索引上具有相同的值,MySQL会首先删除旧行,然后插入新行。这种...

    浅析MySQL replace into 的用法

    MySQL中的`REPLACE INTO`语句是一个非常实用的命令,它结合了`INSERT`和`DELETE`的功能,能够简化在数据库操作中常见的“先检查后更新”流程。这个语句适用于那些希望在数据存在时更新,而非插入新数据的情况。 在...

    MySQL中replace into语句的用法详解

    `REPLACE`与`INSERT ON DUPLICATE KEY UPDATE`的区别** `REPLACE INTO`的行为与`INSERT INTO ... ON DUPLICATE KEY UPDATE`类似,但后者提供了更大的灵活性。当冲突发生时,`ON DUPLICATE KEY UPDATE`允许你指定要...

Global site tag (gtag.js) - Google Analytics