ホームページ バックエンド開発 PHPチュートリアル MongoDB インデックスの使用方法

MongoDB インデックスの使用方法

Dec 01, 2017 am 11:38 AM
mongodb 使用 索引

この記事では、MongoDB インデックスの使用方法について詳しく説明します。インデックスは本の目次のようなもので、目次を使用せずに特定のコンテンツを検索することしかできません。記事全体を検索して参照すると、効率が非常に低くなります。目次を使用すると、特定のコンテンツが含まれる領域をすぐに見つけることができ、効率が直線的に向上します。

インデックス作成の概要

まずコマンドラインを開いて「mongo」と入力します。デフォルトでは、mongodb は test という名前のデータベースに接続します。

➜ ~ mongo

MongoDB shell version: 2.4.9
connecting to: test
> show collections
>
ログイン後にコピー

show collections/tables を使用して、データベースが空であることを確認できます。

次に、mongodb コマンドラインターミナルで次のコードを実行します

> for(var i=0;i<100000;i++) {
... db.users.insert({username:&#39;user&#39;+i})
... }
> show collections
system.indexes
users
>
ログイン後にコピー

次に、データベースをチェックして、さらに system.index と ユーザー用のテーブルは 2 つあり、前者はいわゆるインデックス、後者は新しく作成されたデータベース テーブルです。
このように、userテーブルには100,000個のデータがあります。

> db.users.find()
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e4"), "username" : "user0" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e5"), "username" : "user1" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e6"), "username" : "user2" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e7"), "username" : "user3" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e8"), "username" : "user4" }
{ "_id" : ObjectId("5694d5da8fad9e319c5b43e9"), "username" : "user5" }
ログイン後にコピー

ここで、任意のデータを見つける必要があります。たとえば、

> db.users.find({username: &#39;user1234&#39;})
{ "_id" : ObjectId("5694d5db8fad9e319c5b48b6"), "username" : "user1234" }
ログイン後にコピー

はこのデータが正常に見つかったことがわかりましたが、詳細な情報を知る必要があり、Explainメソッドを追加する必要があります

   
> db.users.find({username: &#39;user1234&#39;}).explain()
{
  "cursor" : "BasicCursor",
  "isMultiKey" : false,
  "n" : 1,
  "nscannedObjects" : 100000,
  "nscanned" : 100000,
  "nscannedObjectsAllPlans" : 100000,
  "nscannedAllPlans" : 100000,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 30,
  "indexBounds" : {
      
  },
  "server" : "root:27017"
}
ログイン後にコピー

には、多くのパラメータがあります。現在、両方の項目の "nscanned": 100000 と "millis": 30 のみに焦点を当てています。

nscanned は、このクエリの完了中に mongodb によってスキャンされたドキュメントの総数を示します。コレクション内のすべてのドキュメントがスキャンされ、合計時間が 30 ミリ秒であることがわかります。

データが 1,000 万個ある場合、ドキュメントがクエリされるたびにデータが走査されます。まあ、時間もかなりのものです。

このようなクエリの場合、インデックス作成は非常に優れたソリューションです。

> db.users.ensureIndex({"username": 1})
ログイン後にコピー

次に user1234

> db.users.ensureIndex({"username": 1})
> db.users.find({username: 'user1234'}).explain()
{
  "cursor" : "BtreeCursor username_1",
  "isMultiKey" : false,
  "n" : 1,
  "nscannedObjects" : 1,
  "nscanned" : 1,
  "nscannedObjectsAllPlans" : 1,
  "nscannedAllPlans" : 1,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 0,
  "indexBounds" : {
    "username" : [
      [
        "user1234",
        "user1234"
      ]
    ]
  },
  "server" : "root:27017"
}
ログイン後にコピー


を検索すると、インデックスを通じて 100,000 件のデータではなく 1 つのデータしか見つからないため、クエリは一瞬で完了します。

もちろん、インデックスの使用にはコストがかかります。インデックスが追加されるたびに、各書き込み操作 (挿入、更新、削除) にかかる時間が長くなります。これは、データが変更されると、ドキュメントを更新する必要があるだけでなく、レベル コレクションのすべてのインデックスも更新されるためです。したがって、mongodb は各コレクションを最大 64 個のインデックスに制限します。一般に、特定のコレクションには 2 つを超えるインデックスを作成しないでください。

ヒント

それが非常に一般的なクエリである場合、またはこのクエリがパフォーマンスのボトルネックを引き起こす場合、特定のフィールド (ユーザー名など) にインデックスを作成することは非常に良い選択です。ただし、管理者 (クエリにかかる時間を気にしない) が使用するクエリのみを目的とする場合、このフィールドにはインデックスを作成しないでください。

複合インデックス

インデックスの値は特定の順序で配置されているため、インデックスキーを使用したドキュメントの並べ替えは非常に高速です。

db.users.find().sort({'age': 1, 'username': 1})


ここでは、最初に年齢で並べ替え、次にユーザー名で並べ替えるので、ここではユーザー名は役割を果たしません。 大きい。この並べ替えを最適化するには、年齢とユーザー名に関するインデックスを作成する必要がある場合があります。

db.users.ensureIndex({'年齢':1, 'ユーザー名': 1})
これにより、複合インデックス (複数のフィールドに構築されたインデックス) が作成されます。これは、クエリ条件に複数のキーが含まれる場合に非常に便利です。

複合インデックスが確立されると、各インデックス エントリには年齢フィールドとユーザー名フィールドが含まれ、ディスク上のドキュメントの保存場所を指します。
現時点では、年齢フィールドは厳密に昇順に配置されています。年齢が等しい場合は、ユーザー名の昇順に配置されます。

Queryメソッド

Pointクエリ

は、単一の値をクエリするために使用されます(ただし、この値を含む複数のドキュメントが存在する可能性があります)

db.users.find({'age': 21}).sort( {'username ': -1})


1 つの年齢と 1 つのユーザー名という複合インデックスがすでに確立されているため、インデックスを確立するときに、ポイント クエリを使用して {age: を検索するときに昇順 (つまり、番号 1) を使用します。 21 }, データがまだ 100,000 件あると仮定すると、21 歳の人はたくさんいると考えられるため、複数のデータが見つかります。次に、sort({'ユーザー名': -1}) は、本来の目的どおり、これらのデータを逆順に並べ替えます。ただし、インデックスを作成するときは「ユーザー名」を忘れないでください。1 は昇順 (小さいものから大きいものへ) です。逆の順序を取得したい場合は、データの最後のインデックスから開始して目的のインデックスを取得するだけです。結果。

ソート方向は関係ありません。mongodb はどの方向からでもインデックスを走査できます。
要約すると、複合インデックスはポイント クエリにおいて非常に効率的であり、結果を並べ替えて結果を返す必要がありません。

複数値クエリ (multi-value-query)

db.users.find({'age': {"$gte": 21, "$lte": 30}})


複数を検索値が一致するドキュメント。複数値クエリは、複数ポイント クエリとして理解することもできます。
上記と同様に、21 歳から 30 歳までの年齢を見つけたいとします。 monogdb は、インデックス内の最初のキー「age」を使用して一致する結果を取得します。結果は通常、インデックス順に並べられます。

db.users.find({'年齢': {"$gte": 21, "$lte": 30}}).sort({'ユーザー名': 1})


与上一个类似,这次需要对结果排序。
在没有sort时,我们查询的结果首先是根据age等于21,age等于22..这样从小到大排序,当age等于21有多个时,在进行usernameA-Z(0-9)这样排序。所以,sort({'username': 1}),要将所有结果通过名字升序排列,这次不得不先在内存中进行排序,然后返回。效率不如上一个高。

当然,在文档非常少的情况,排序也花费不了多少时间。
如果结果集很大,比如超过32MB,MongoDB会拒绝对如此多的数据进行排序工作。

还有另外一种解决方案

也可以建立另外一个索引{'username': 1, 'age': 1}, 如果先对username建立索引,当再sortusername,相当没有进行排序。但是需要在整个文档查找age等于21的帅哥美女,所以搜寻时间就长了。

但哪个效率更高呢?

如果建立多个索引,如何选择使用哪个呢?
效率高低是分情况的,如果在没有限制的情况下,不用进行排序但需要搜索整个集合时间会远超过前者。但是在返回部分数据(比如limit(1000)),新的赢家就产生了。

   
>db.users.find({&#39;age&#39;: {"$gte": 21, "$lte": 30}}).
sort({username&#39;: 1}).
limit(1000).
hint({&#39;age&#39;: 1, &#39;username&#39;: 1})
explain()[&#39;millis&#39;]
2031ms
  
>db.users.find({&#39;age&#39;: {"$gte": 21, "$lte": 30}}).
sort({username&#39;: 1}).
limit(1000).
hint({&#39;username&#39;: 1, &#39;age&#39;: 1}).
explain()[&#39;millis&#39;]
181ms
ログイン後にコピー


其中可以使用hint指定要使用的索引。
所以这种方式还是很有优势的。比如一般场景下,我们不会把所有的数据都取出来,只是去查询最近的,所以这种效率也会更高。

索引类型

唯一索引

可以确保集合的每个文档的指定键都有唯一值。

db.users.ensureIndex({&#39;username&#39;: 1, unique: 
true})
ログイン後にコピー


比如使用mongoose框架,在定义schema时,即可指定unique: true.
如果插入2个相同都叫张三的数据,第二次插入的则会失败。_id即为唯一索引,并且不能删除。

稀疏索引

使用sparse可以创建稀疏索引

>db.users.ensureIndex({&#39;email&#39;: 1}, {&#39;unique&#39;: true, &#39;sparse&#39;: 
true})
ログイン後にコピー

索引管理

system.indexes集合中包含了每个索引的详细信息

db.system.indexes.find()
ログイン後にコピー

1.ensureIndex()创建索引

db.users.ensureIndex({&#39;username&#39;: 
1})
ログイン後にコピー


后台创建索引,这样数据库再创建索引的同时,仍然能够处理读写请求,可以指定background选项。

db.test.ensureIndex({"username":1},{"background":true})
ログイン後にコピー

2.getIndexes()查看索引

db.collectionName.getIndexes()
db.users.getIndexes()
[
  {
    "v" : 1,
    "key" : {
      "_id" : 1
    },
    "ns" : "test.users",
    "name" : "_id_"
  },
  {
    "v" : 1,
    "key" : {
      "username" : 1
    },
    "ns" : "test.users",
    "name" : "username_1"
  }
]
ログイン後にコピー


其中v字段只在内部使用,用于标识索引版本。

3.dropIndex删除索引

> db.users.dropIndex("username_1")
{ "nIndexesWas" : 2, "ok" : 1 }
ログイン後にコピー


全选复制放进笔记> db.users.dropIndex({"username":1})

以上内容就是MongoDB索引的使用详解,希望对大家有帮助。

相关推荐:

MongoDB的技巧与注意事项汇总

MongoDB索引概念及使用详解

Dex – MongoDB索引优化工具

以上がMongoDB インデックスの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? Apr 26, 2024 am 09:40 AM

MetaMask (中国語ではリトル フォックス ウォレットとも呼ばれます) は、無料で評判の高い暗号化ウォレット ソフトウェアです。現在、BTCC は MetaMask ウォレットへのバインドをサポートしており、バインド後は MetaMask ウォレットを使用してすぐにログイン、値の保存、コインの購入などが可能になり、初回バインドで 20 USDT のトライアル ボーナスも獲得できます。 BTCCMetaMask ウォレットのチュートリアルでは、MetaMask の登録方法と使用方法、および BTCC で Little Fox ウォレットをバインドして使用する方法を詳しく紹介します。メタマスクウォレットとは何ですか? 3,000 万人を超えるユーザーを抱える MetaMask Little Fox ウォレットは、現在最も人気のある暗号通貨ウォレットの 1 つです。無料で使用でき、拡張機能としてネットワーク上にインストールできます。

navicat の有効期限が切れた場合の対処方法 navicat の有効期限が切れた場合の対処方法 Apr 23, 2024 pm 12:12 PM

Navicat の有効期限の問題を解決するには、ライセンスを更新する、自動更新を無効にする、Navicat プレミアム エッセンシャルの無料バージョンを使用する、などがあります。

Bitget Launchpool とは何ですか? Bitget Launchpool の使用方法? Bitget Launchpool とは何ですか? Bitget Launchpool の使用方法? Jun 07, 2024 pm 12:06 PM

BitgetLaunchpool は、すべての暗号通貨愛好家向けに設計された動的プラットフォームです。 BitgetLaunchpool はそのユニークな製品で際立っています。ここでは、トークンを賭けて、エアドロップ、高額な報酬、初期参加者限定の寛大な賞金プールなど、より多くの報酬のロックを解除できます。 BitgetLaunchpool とは何ですか? BitgetLaunchpool は、ユーザーフレンドリーな利用規約でトークンをステークして獲得できる暗号通貨プラットフォームです。 Launchpool に BGB またはその他のトークンを投資することで、ユーザーは無料のエアドロップや収益を受け取り、寛大なボーナス プールに参加する機会が得られます。質入れられた資産からの収入は T+1 時間以内に計算され、報酬は以下に基づいて計算されます。

navicat を mongodb に接続する方法 navicat を mongodb に接続する方法 Apr 24, 2024 am 11:27 AM

Navicat を使用して MongoDB に接続するには、次の手順を実行する必要があります: Navicat をインストールする MongoDB 接続を作成します: a. 接続名、ホスト アドレス、およびポートを入力します b. 認証情報を入力します (必要な場合) SSL 証明書を追加します (必要な場合) 接続を確認します接続を保存する

net4.0の用途は何ですか net4.0の用途は何ですか May 10, 2024 am 01:09 AM

.NET 4.0 はさまざまなアプリケーションの作成に使用され、オブジェクト指向プログラミング、柔軟性、強力なアーキテクチャ、クラウド コンピューティングの統合、パフォーマンスの最適化、広範なライブラリ、セキュリティ、スケーラビリティ、データ アクセス、モバイルなどの豊富な機能をアプリケーション開発者に提供します。開発サポート。

サーバーレスアーキテクチャでのJava関数とデータベースの統合 サーバーレスアーキテクチャでのJava関数とデータベースの統合 Apr 28, 2024 am 08:57 AM

サーバーレス アーキテクチャでは、Java 関数をデータベースと統合して、データベース内のデータにアクセスして操作できます。主な手順には、Java 関数の作成、環境変数の構成、関数のデプロイ、および関数のテストが含まれます。これらの手順に従うことで、開発者はデータベースに保存されているデータにシームレスにアクセスする複雑なアプリケーションを構築できます。

DebianでMongodbの高可用性を確保する方法 DebianでMongodbの高可用性を確保する方法 Apr 02, 2025 am 07:21 AM

この記事では、Debianシステムで非常に利用可能なMongoDBデータベースを構築する方法について説明します。データのセキュリティとサービスが引き続き動作し続けるようにするための複数の方法を探ります。キー戦略:レプリカセット:レプリカセット:レプリカセットを使用して、データの冗長性と自動フェールオーバーを実現します。マスターノードが失敗すると、レプリカセットが自動的に新しいマスターノードを選択して、サービスの継続的な可用性を確保します。データのバックアップと回復:MongoDumpコマンドを定期的に使用してデータベースをバックアップし、データ損失のリスクに対処するために効果的な回復戦略を策定します。監視とアラーム:監視ツール(プロメテウス、グラファナなど)を展開して、MongoDBの実行ステータスをリアルタイムで監視し、

DebianでMongoDB自動拡張を構成する方法 DebianでMongoDB自動拡張を構成する方法 Apr 02, 2025 am 07:36 AM

この記事では、自動拡張を実現するためにDebianシステムでMongodbを構成する方法を紹介します。主な手順には、Mongodbレプリカセットとディスクスペース監視のセットアップが含まれます。 1。MongoDBのインストール最初に、MongoDBがDebianシステムにインストールされていることを確認してください。次のコマンドを使用してインストールします。sudoaptupdatesudoaptinstinstall-yymongodb-org2。mongodbレプリカセットMongodbレプリカセットの構成により、自動容量拡張を達成するための基礎となる高可用性とデータ冗長性が保証されます。 Mongodbサービスを開始:Sudosystemctlstartmongodsudosys

See all articles