私はmongodbとmysqlの両方でデータを取得しようとしました。行にはフィールドlist_idがあり、1つの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ではこの条件を満たすすべての100K行を削除するのに約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