1

遊んだ後

db.largecollection.find({$ or:[{identifierX: "sha1_hash123"}、{identifierY: "md5_hash456"}、{identifierZ: "another_hash789"}]})

mongodbが自動的に作成したインデックスを確認しました。識別子x/y / zの「単一の」ensureIndexに加えて、現在識別子X_1_identifierY_1_identifierZ_1があり、パフォーマンスが低下しています:-(

$ andはないが、$ orクエリがあるので、単一の識別子にインデックスを使用する方が速いことをmongodbに説明する方法やヒントはありますか?

どうも

4

1 に答える 1

3

MongoDB は独自にインデックスを作成しません。これは、アプリケーション、ユーザー、またはフレームワークが行うことです。クエリの場合、MongoDB は、identifierX、identifierY、または identifierZ のいずれかのインデックスしか使用できませんでした。ただし、そのようなインデックスがない場合は、もちろん何も使用されません。このidentifierX_1_identifierY_1_identifierZ_1クエリにはインデックスを使用できません。

この場合、おそらく、このすべての識別子のインデックスを作成する必要があります。

db.ensureIndex( { 'identifierX' : 1 } );
db.ensureIndex( { 'identifierY' : 1 } );
db.ensureIndex( { 'identifierZ' : 1 } );

MongoDB は一度に 1 つのインデックスしか使用できず、"最適な" インデックスを選択しようとします。使用explainして、どのインデックスが選択されているかを確認してください。

db.largecollection.find( { $or : [
    { identifierX : "sha1_hash123" },
    { identifierY : "md5_hash456" },
    { identifierZ : "another_hash789" }
] } ).explain();

これにより、どのインデックスが使用されているかについてのアイデアが得られるはずです。

$orただし、MongoDB がパーツごとに異なるインデックスを使用し、重複排除できるという例外があります。ここのドキュメントにあります。(もちろん) 複合インデックスはまだ使用されていないため、上記で記述したインデックスが必要です。

于 2012-06-05T12:42:42.813 に答える