0

私は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
4

2 に答える 2

2

数字と詳細のない無意味な質問。トランザクションの整合性、外部キーの処理などは MongoDB よりもコストがかかるため、RDBMS からデータを削除するとコストが高くなることは明らかです。特にMongoDBはファイア・アンド・フォーゲットで、操作が終わっていないことに気付かない

于 2012-05-10T10:44:21.067 に答える
0

ボトルネックがクエリであるかどうかを確認できます。これにはどのくらいかかりますか?

SELECT FROM contacts WHERE list_id = 100

それが速い場合、いくつかの通常のアプローチは

  • rows_affected が > 0 である限り、チャンク単位で削除します

    DELETE FROM contact WHERE list_id = 100 LIMIT 1000

  • インデックスを削除 (list_id を除く)、DELETE、インデックスを再作成します。MySQL は、削除するたびにインデックスを再構築する必要があります。

  • 論理削除列を追加します。クエリでそれを尊重してください。古いレコードを時々削除する cron ジョブを実行します。

    UPDATE 連絡先 SET 削除済み = true WHERE list_id = 100

  • 別のストレージ エンジン (MyISAM) を試す

于 2012-05-10T11:08:57.640 に答える