mysql update和delete性能疑问

sysoperator 2012-02-29 10:51:14
在网上查阅了相关资料,解释是这样的:

update在mysql中的处理过程是先delete然后再insert新的记录;

然后我自己做了个测试
表结构很简单,只有一个普通的id字段,没加索引
test1:
mysql> insert into testupdate select * from testupdate;
Query OK, 1048576 rows affected (10.16 sec)
Records: 1048576 Duplicates: 0 Warnings: 0

mysql> update testupdate set id=0;
Query OK, 2097152 rows affected (21.31 sec)
Rows matched: 2097152 Changed: 2097152 Warnings: 0

mysql> delete from testupdate where id=0;
Query OK, 2097152 rows affected (21.96 sec)

按理说,delete的时间应该会小于update的,但是为什么会出现这样的结果,请解释下,-----注,在更新前,表里的记录都是id=1

...全文
439 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起混吧 2012-02-29
  • 打赏
  • 举报
回复
你试着不加where条件试试。因为id不是索引字段。delete时比较耗时。
sysoperator 2012-02-29
  • 打赏
  • 举报
回复
补充回复下版主,我本地的mysql确定是没跑其他应用
sysoperator 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwa 的回复:]
delete有条件且没有索引、UPDATE没有,去掉delete的条件试试
[/Quote]
谢谢回复:我这边给update加个匹配条件,测试结果如下
mysql> update testupdate set id=0 where id=1;
Query OK, 2097152 rows affected (21.59 sec)
Rows matched: 2097152 Changed: 2097152 Warnings: 0

mysql> delete from testupdate where id=0;
Query OK, 2097152 rows affected (20.14 sec)
----------------------------------------------------
貌似差异很小,

sysoperator 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
建议你单独测试,以避免其它程序的干扰,比如是不是有其它程序在访问数据库?

下面测试结果显然和你的结论不一致。

SQL code

mysql> select count(*) from testupdate;
+----------+
| count(*) |
+----------+
| 10485760 |
+----------+
1 row in set (0.……
[/Quote]

谢谢回复,我参照 wwwwA的提示,给update也加上了条件,测试结果如下

mysql> update testupdate set id=0 where id=1;
Query OK, 2097152 rows affected (21.59 sec)
Rows matched: 2097152 Changed: 2097152 Warnings: 0

mysql> delete from testupdate where id=0;
Query OK, 2097152 rows affected (20.14 sec)

-----------------------------------
为什么你上面的测试结果会有这么大的差距,难道就是加了where条件吗?
ACMAIN_CHM 2012-02-29
  • 打赏
  • 举报
回复
建议你单独测试,以避免其它程序的干扰,比如是不是有其它程序在访问数据库?

下面测试结果显然和你的结论不一致。

mysql> select count(*) from testupdate;
+----------+
| count(*) |
+----------+
| 10485760 |
+----------+
1 row in set (0.06 sec)

mysql> update testupdate set id=0;
Query OK, 10485760 rows affected (38.28 sec)
Rows matched: 10485760 Changed: 10485760 Warnings: 0

mysql> delete from testupdate;
Query OK, 10485760 rows affected (0.67 sec)

mysql>
rucypli 2012-02-29
  • 打赏
  • 举报
回复
update在mysql中的处理过程是先delete然后再insert新的记录;



显然这个delete不等于sql语句里面的delete
WWWWA 2012-02-29
  • 打赏
  • 举报
回复
delete有条件且没有索引、UPDATE没有,去掉delete的条件试试
ACMAIN_CHM 2012-02-29
  • 打赏
  • 举报
回复
[Quote]update在mysql中的处理过程是先delete然后再insert新的记录;[/Quote]这句说明本身就不成立。
sysoperator 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iihero 的回复:]
楼主从哪里看到这样的结论:
"在网上查阅了相关资料,解释是这样的:update在mysql中的处理过程是先delete然后再insert新的记录;"?

另外,你用的是什么存储引擎?
[/Quote]

你好,我的引擎是innodb,这个结论我在某个数据库论坛看到的,我也是无从考证,所以自己做测试来验证,
iihero 2012-02-29
  • 打赏
  • 举报
回复
楼主从哪里看到这样的结论:
"在网上查阅了相关资料,解释是这样的:update在mysql中的处理过程是先delete然后再insert新的记录;"?

另外,你用的是什么存储引擎?



sysoperator 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jordan102 的回复:]
你试着不加where条件试试。因为id不是索引字段。delete时比较耗时。
[/Quote]
你好,我这边问题的关键其实是想知道,为什么同样的查询范围下,update的性能会低于delete

57,005

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧