在网上查阅了相关资料,解释是这样的: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: 0mysql> update testupdate set id=0;
Query OK, 2097152 rows affected (21.31 sec)
Rows matched: 2097152  Changed: 2097152  Warnings: 0mysql> delete from testupdate where id=0;
Query OK, 2097152 rows affected (21.96 sec)按理说,delete的时间应该会小于update的,但是为什么会出现这样的结果,请解释下,-----注,在更新前,表里的记录都是id=1

解决方案 »

  1.   

    delete有条件且没有索引、UPDATE没有,去掉delete的条件试试
      

  2.   

    建议你单独测试,以避免其它程序的干扰,比如是不是有其它程序在访问数据库?下面测试结果显然和你的结论不一致。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: 0mysql> delete from testupdate;
    Query OK, 10485760 rows affected (0.67 sec)mysql>
      

  3.   


    谢谢回复,我参照 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: 0mysql> delete from testupdate where id=0;
    Query OK, 2097152 rows affected (20.14 sec)-----------------------------------
    为什么你上面的测试结果会有这么大的差距,难道就是加了where条件吗?
      

  4.   

    谢谢回复:我这边给update加个匹配条件,测试结果如下
    mysql> update testupdate set id=0 where id=1;
    Query OK, 2097152 rows affected (21.59 sec)
    Rows matched: 2097152 Changed: 2097152 Warnings: 0mysql> delete from testupdate where id=0;
    Query OK, 2097152 rows affected (20.14 sec)
    ----------------------------------------------------
    貌似差异很小,
      

  5.   

    补充回复下版主,我本地的mysql确定是没跑其他应用
      

  6.   

    你试着不加where条件试试。因为id不是索引字段。delete时比较耗时。
      

  7.   

    你好,我这边问题的关键其实是想知道,为什么同样的查询范围下,update的性能会低于delete
      

  8.   

    楼主从哪里看到这样的结论:
    "在网上查阅了相关资料,解释是这样的:update在mysql中的处理过程是先delete然后再insert新的记录;"?另外,你用的是什么存储引擎?
      

  9.   


    你好,我的引擎是innodb,这个结论我在某个数据库论坛看到的,我也是无从考证,所以自己做测试来验证,
      

  10.   

    update在mysql中的处理过程是先delete然后再insert新的记录;显然这个delete不等于sql语句里面的delete