为什么在mongdb中删除多个文档比在mysql中删除多行要快得多
我试着在mongodb和mysql中保存数据。一行有字段列表id,一个列表id可以有很多行。看起来在mongdb中删除多个文档比在mysql中删除多行要快得多。我在mysql中使用innodb引擎。 Mysql和mongdb在同一台服务器上。 比如说,为什么在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
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)
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自动提交模型类似。通过保持事务支持极其简单,性能得到了增强,特别是在可能跨多台服务器运行的系统中。