【发布时间】:2012-05-18 21:58:06
【问题描述】:
我尝试在 mongodb 和 mysql 中都输入数据。一行有字段 list_id,一个 list_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
}
例如,如果有100K行满足条件,在mongodb中大约快30倍,在mysql中大约需要99秒才能删除所有满足条件的100K行。
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 是即发即弃的,当操作未完成时您不会注意到。
-
在mongodb中使用的是安全模式,所以应该等到删除。
-
由于您没有说明您使用的是什么引擎(innodb、myisam 或其他),因此很难确切说明原因,但众所周知,Mongo 做的更少并延迟了 fsync-ing,因此提高速度(并且不时丢失记录)。
-
我在mysql中使用innodb引擎。
-
问题然后扩展到什么是 InnoDB 的配置值,您在什么硬件上运行它,mongo 与 mysql 等在同一台机器上,但底线是 mongo 通过延迟写入来实现其速度到磁盘。它的 I/O 也比 mysql 少,而且它的 CPU 密集度不高。这里的场景是无穷无尽的,确定发生了什么的最好方法是检查从每个 IO 中删除时正在执行的 IO 数量,这将为您提供答案。
标签: mysql mongodb mongodb-php