Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在mongdb中删除多个文档比在mysql中删除多行要快得多_Mysql_Mongodb_Mongodb Php - Fatal编程技术网

为什么在mongdb中删除多个文档比在mysql中删除多行要快得多

为什么在mongdb中删除多个文档比在mysql中删除多行要快得多,mysql,mongodb,mongodb-php,Mysql,Mongodb,Mongodb Php,我试着在mongodb和mysql中保存数据。一行有字段列表id,一个列表id可以有很多行。看起来在mongdb中删除多个文档比在mysql中删除多行要快得多。我在mysql中使用innodb引擎。 Mysql和mongdb在同一台服务器上。 比如说, DELETE FROM contacts WHERE list_id = 100 速度比以前慢得多 return self::remove(array('LISTID' => $listId), array('safe' => tr

我试着在mongodb和mysql中保存数据。一行有字段列表id,一个列表id可以有很多行。看起来在mongdb中删除多个文档比在mysql中删除多行要快得多。我在mysql中使用innodb引擎。 Mysql和mongdb在同一台服务器上。 比如说,

DELETE FROM contacts WHERE list_id = 100
速度比以前慢得多

return self::remove(array('LISTID' => $listId), array('safe' => true));
我在php中使用驱动程序的安全模式,所以它应该等到删除所有数据

以下是有关mongodb集合的信息:

 "count" : 23456989,
        "size" : 4391452160,
        "avgObjSize" : 187.21295218239646,
        "storageSize" : 5727051776,
        "numExtents" : 32,
        "nindexes" : 2,
        "lastExtentSize" : 961069056,
        "paddingFactor" : 1.0099999999950207,
        "flags" : 1,
        "totalIndexSize" : 2983806672,
        "indexSizes" : {
                "_id_" : 787504144,
                "LISTID_1_EMAIL_1" : 2196302528
        },
        "ok" : 1
}
例如,如果有10万行符合条件,在mongodb中大约快30倍,在mysql中删除所有符合条件的10万行大约需要99秒

mysql和mongodb中都使用索引

EXPLAIN SELECT *
FROM `subscribers`
WHERE list_id =118

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  subscribers     ref     FK_list_id  FK_list_id  4   const   1    
我现在不在线进行这些操作,我将数据放入队列并在后台执行,逐块删除数据

但我想知道为什么删除的时间相差这么大,大约20-30次。 是否在mongodb中删除要快得多,因为此操作在mongodb中不是原子操作

这是什么

SET PROFILING = 1;
DELETE FROM subscribers WHERE list_id = 118;
SHOW PROFILE FOR QUERY 1;
用于删除100K行的显示:

starting    0.000052
checking permissions    0.000000
Opening tables  0.000000
System lock     0.000000
init    0.000000
updating    84.382015
end     0.000006
Waiting for query cache lock    0.000002
end     0.000006
query end   0.035284
closing tables  0.000021
freeing items   0.000040
logging slow query  0.000001
logging slow query  0.000002
cleaning up     0.000002

没有数字和细节的毫无意义的问题。很明显,从RDBMS中删除内容的成本可能更高,因为事务完整性、处理外键等比MongoDB中的成本更高。尤其是MongoDB是fire and forget,当操作未完成时,您不会注意到它。

您可以验证瓶颈是否是查询。这需要多长时间

SELECT FROM contacts WHERE list_id = 100
如果它很快,那么一些常用的方法将是

  • 只要受影响的行\u>0,就分块删除

    从列表_id=100限制1000的联系人中删除

  • 删除索引(列表id除外)、删除、重新创建索引。MySql必须在每次删除时重建索引

  • 添加逻辑删除列。在你的询问中尊重这一点。运行cron作业,不时删除旧记录

    更新联系人集已删除=true,其中列表\u id=100

  • 尝试另一个存储引擎(MyISAM)


没有数字和细节的毫无意义的问题。很明显,从RDBMS中删除内容的成本可能更高,因为事务完整性、处理外键等比MongoDB中的成本更高。特别是MongoDB是fire and forget,当操作未完成时,您不会注意到。在MongoDB中使用了安全模式,因此应该等到删除。由于您没有说明您使用的引擎(innodb、myisam或其他),很难说确切原因,但众所周知,Mongo做的更少,延迟了fsync,因此,我在mysql中使用innodb引擎。然后问题扩展到innodb的配置值是什么,运行它的硬件是什么,mongo是否与mysql在同一台机器上,等等,但底线是mongo通过延迟磁盘写入来实现其速度。它的I/O也比mysql少得多,而且它不太占用CPU。这里的场景是无穷无尽的,确定发生了什么的最好方法是检查从每个IOs中删除时正在执行的IOs数量,这将为您提供答案。在mongodb中使用安全模式,因此应该等到删除。您想要什么数字和详细信息?我有2辆车。A车比B车快30倍。你想要什么数字?在我的问题中,我写道,在mysql中,删除10万行大约需要99秒。我说字段是索引,所以从联系人中选择list_id=100是快的。在我的问题中,我写道我现在不在线进行此操作,我将数据放入队列并在后台执行,按块删除数据,脚本由cron运行。问题是为什么mongodb和mysql中的删除时间相差如此之大。我不能使用MyISAM,因为我需要事务,所有创建的索引都是查询数据所必需的。InnoDB需要在每次插入/更新/删除行时重建其索引。对于插入,MySQL支持
INSERT DELAYED…
命令,它解决了批量插入的这个问题。对于删除,没有比这更好的了。由于InnoDB使用事务,并且可能会发生查询100,00 0的记录99999失败的情况,InnoDB必须回滚整个事务,这是一项艰巨的任务(假设contacts与contact_numbers有FK关系,在delete cascade上使用
回滚的次数更多。因此,尝试一次删除1000到10000行之间的内容,这应该会提高速度。我不知道mongodb的详细信息。但我想
safe=true
只意味着呼叫会等待作业完成。哈ppens,如果操作在100000条记录中的70000条记录中失败?是否对每个已删除的记录都回滚完整的操作?我想不是。从mongodb常见问题解答:
mongodb不使用传统的锁定或复杂的事务回滚,因为它被设计为轻量级、快速和可预测的性能。它可以是应该与MySQL MyISAM自动提交模型类似。通过保持事务支持极其简单,性能得到了增强,特别是在可能跨多台服务器运行的系统中。