SlideShare a Scribd company logo
システム可用性を拡張するイン 
デクス戦略 
鈴木いっぺい 
MongoDB, Inc.
アジェンダ 
• インデクスとは何か? 
• インデクスの基本 
• 評価/チューニング 
• 地理空間情報機能(Geospacial) 
• テキスト検索 
• スケーリング
インデクスとは何か?
インデクスとは何か? 
料理の本から特定の料理を、そのレシピの名前 
から探そうとした時、索引からレシピを探すの 
が最も早い。
索引(インデクス)を利用
連結リスト 
1 2 3 4 5 6 7
連結リストを使ってアイテム7を探す 
1 2 3 4 5 6 7
ツリー構造からアイテム7を探す 
1 
2 
3 
4 
7 
6 
5
MongoDB内のインデクスはB-Treesによっ 
て構造化
Query, Insert, Delete処理
インデクスはMongoDBの性 
能チューニングにとって最も 
重要な要素
インデクスの基本
インデクスの基本 
• データベース性能を決める最大要素 
13 
– インデクスの効果はシステムデザインの初期からレビュー 
が必要 
– 冗長なインデクス設定を避ける事 
// authorのインデクス(abc順) 
>db.articles.ensureIndex( { author : 1 } ) 
– . 
// authorのインデクス(abcとは逆順) 
>db.articles.ensureIndex( { author : -1 } ) 
// 複数要素の配列のインデクス– マルチキーインデクス 
>db.articles.ensureIndex( { tags : 1 } )
サブドキュメント(Sub-document) 
インデクス 
• サブドキュメントでのインデクス 
14 
– ドット表記を使用 
{ 
‘_id’ : ObjectId(..), 
‘article_id’ : ObjectId(..), 
‘section’ : ‘schema’, 
‘date’ : ISODate(..), 
‘daily’: { ‘views’ : 45, 
‘comments’ : 150 } 
‘hours’ : { 
0 : { ‘views’ : 10 }, 
1 : { ‘views’ : 2 }, 
… 
23 : { ‘views’ : 14, 
‘comments’ : 10 } 
} 
} 
>db.interactions.ensureIndex( 
{ “daily.comments” : 1} 
} 
>db.interactions.find( 
{“daily.comments” : { $gte : 150} } , 
{ _id:0, “daily.comments” : 1 } 
)
複合(Compound)インデクス 
• 複数の要素をもつインデクス 
15 
//コンソールで表示 
> db.articles.ensureIndex( { author : 1, tags : 1 } ) 
> db.articles.find( { author : ‘Joe D’, tags : ‘MongoDB’} ) 
//さらに次も可能 
> db.articles.find( { author : ‘Joe D’ } ) 
// Author単一のインデックス指定は必要なし 
> db.articles.ensureIndex( { author : 1 } )
ソート処理の順序 
• 単一インデクスの場合はソートは単純 
16 
– B-Treeのいずれからも検索可能 
• { attribute: 1 } もしくは{ attribute: -1 } 
• 複合インデクスの場合はソート順序が重要 
– 作者(author)で検索し、日付でソートをしたい場合 
// 作者(author)は名前順、日付は新しい日付を先にソートしてインデックする 
>db.articles.ensureIndex( { ‘author’ : 1, ‘date’ -1 } )
カバード(Covered)もしくはインデクスのみ 
のクエリー 
• 参照データはインデクスから戻ってくる 
17 
– データベースファイルはアクセスしない 
– 性能の大幅な向上 
– Compoundインデクスでも使用可能 
• プロジェクション(projection)で指定 
> db.users.ensureIndex( { user : 1, password :1 } ) 
> db.user.find({ user:”joe” }, 
{ _id:0, password:1 } 
) 
参考: プロジェクションを使ってクライアントに戻すデータを減らす事も考慮せよ 
(_id=0  Object_id を参照しない)
オプション 
18 
• ユニーク度の制限(unique, dropDups) 
// authorのインデクスはユニークである必要(一つしか存在しない) 
>db.articles.ensureIndex( { ‘author’ : 1}, { unique : true } ) 
• スパース(Sparce) インデクス 
// likesのフィールドを持たないドキュメントが複数あっても良い 
>db.articles.ensureIndex( { ‘author’ : 1, ‘likes’ : 1}, { sparse: true } ) 
* 抜けているフィールドはインデクス内でnull として記録
バックグラウンドでのインデクス生成 
• インデクス生成は長時間かかる事も多い 
• この生成をバックグラウンドに指定する事により他の 
オプレーションに対する影響を最小限に 
• バックグラウンドで複数のインデクスの生成も可能 
• レプリカセットから一旦外したセカンダリーでインデク 
スを生成 
19 
// バックグラウンドでのインデクス生成 
> db.articles.ensureIndex( 
{ ‘author’ : 1, ‘date’ -1 }, 
{background : true} 
)
Explain planコマンド 
• インデクスとオペレーションの分析を行う際に使用 
20 
– どのインデクスが使用されたかを確認 
– どれくらいのドキュメント/オブジェクトがスキャンされたかを 
確認 
– コンソール経由、もしくはコードで表示 
//コンソールで結果を表示する 
> db.articles.find({author:’Joe D'}).explain()
Explain planコマンドの出力(インデクス 
無し) 
21 
{ 
"cursor" : ”BasicCursor", 
"isMultiKey" : false, 
"n" : 12, 
"nscannedObjects" : 25820, 
"nscanned" : 25820, 
… 
"indexOnly" : false, 
… 
"millis" : 27, 
… 
} 
他のタイプ: 
• BasicCursor 
• コレクション全体スキャン 
(インデクス使用せず) 
• BtreeCursor 
• GeoSearchCursor 
• Complex Plan 
• TextCursor
Explain planコマンドの出力 
22 
{ 
"cursor" : "BtreeCursor author_1_date_- 
1", 
"isMultiKey" : false, 
"n" : 12, 
"nscannedObjects" : 12, 
"nscanned" : 12, 
… 
"indexOnly" : false, 
… 
"millis" : 0, 
… 
} 
他のタイプ: 
• BasicCursor 
• コレクション全体スキャン 
• BtreeCursor 
• GeoSearchCursor 
• Complex Plan 
• TextCursor
データベースプロファイラー 
• 遅いクエリー処理の発見 
23 
– すべてを表示する事もオプション指定可能 
– デフォルトは100ms以上の処理の表示 
//プロファイラの結果をコンソールに表示, 0=オフ1=遅い処理のみ2=すべて 
> db.setProfilingLevel(1, 100) 
{ "was" : 0, "slowms" : 100, "ok" : 1 } 
//プロファイル結果の表示 
> show profile 
//もしくは次の方法でも可能 
>db.system.profile.find().pretty()
クエリーの最適化 
• 各クエリーに対して、MongoDBは定期的に有効なイ 
ンデクスをすべて使う。 
• 最適なプランを発見次第、他のインデクスの使用を 
中止 
• 選択されたプランは、一時的にキャッシュされ、他の 
タイプのクエリーにも適用される(1000回分使用され 
る) 
• MongoDB 2.6はクエリー処理に複数のインデクスの 
組み合わせ(intersection)をサポート 
24
他のインデクスタイプ 
25 
• 地理空間(Geospatial)インデクス(2次元球体) 
• テキストインデクス 
• TTLコレクション(期限付き条件) 
• シャーディング向けのハッシュインデクス
地理空間(Geo Spatial)インデクス
2次元球体 
• 地理空間上の位置情報をインデクス化 
27 
– GeoJSON オブジェクトを使用 
– 球体の上での2次元位置情報 
//GeoJSON インデクスのためのオブジェクト構造 
{ 
name: ’MongoDB Palo Alto’, 
location: { type : “Point”, 
coordinates: [ 37.449157 , -122.158574 ] } 
} 
// GeoJSONオブジェクトのインデクス化 
>db.articles.ensureIndex( { location: “2dsphere” } ) 
サポートされるGeoJSON オ 
ブジェクト: 
Point(点) 
LineString(線) 
Polygon(ポリゴン) 
MultiPoint(複数点) 
MultiLineString(複数線) 
MultiPolygon(複数ポリゴン) 
GeometryCollection (位置情 
報コレクション)
記事情報の拡張機能 
• 記事(article)が投稿さ 
28 
れた位置情報を記録す 
る 
• 位置情報はブラウザー 
から 
Articles コレクション 
>db.articles.insert({ 
'text': 'Article 
content…’, 
'date' : ISODate(...), 
'title' : ’Intro to 
MongoDB’, 
'author' : ’Joe D’, 
'tags' : ['mongodb', 
'database', 
'nosql’], 
‘location’ : { 
‘type’ : ‘Point’, 
‘coordinates’ : 
[37.449, -122.158] 
} 
}); 
//位置情報を取得するJavascript機能. 
navigator.geolocation.getCurrentPosition(); 
//GeoJSONデータ構造に変換する必要あり
例 
29 
– 指定した座標値に”近い”場所を検索する 
>db.articles.find( { 
location: { $near : 
{ $geometry : 
{ type : "Point”, coordinates : [37.449, -122.158] } }, 
$maxDistance : 5000 
} 
} )
テキスト検索
テキストインデクス 
• テキストインデクスを使用してコレクション内のド 
31 
キュメントの中にある文字列検索を行う 
• テキストインデクスは任意の文字情報、もしくは 
文字情報の配列でも可 
• テキストインデクスを利用した検索の際には、 
$text オペレータを使用
テキスト検索 
• コレクション一つに対し 
32 
て一つのテキストイン 
デクス 
• $** オペレータを使い、 
コレクション内の文字列 
をインデクス化 
• “weights”を使って文 
字列の重要度を指定 
>db.articles.ensureIndex( 
{title: ”text”, content: ”text”} 
) 
>db.articles.ensureIndex( 
{ "$**" : “text”, 
name : “MyTextIndex”} ) 
>db.articles.ensureIndex( 
{ "$**" : "text”}, 
{ weights : 
{ ”title" : 10, ”content" : 5}, 
name : ”MyTextIndex” } 
) 
オペレータ 
$text, $search, $language, 
$meta
検索 
• $text と$search オペレータを使ってクエリー処理 
• Cursorが戻ってくる 
• $meta を使って結果のスコアを求める 
33 
// Articlesコレクション内を検索 
> db.articles.find ({$text: { $search: ”MongoDB" }}) 
– . 
> db.articles.find( 
{ $text: { $search: "MongoDB" }}, 
{ score: { $meta: "textScore" }, _id:0, title:1 } ) 
{ "title" : "Intro to MongoDB", "score" : 0.75 }
スケーリング
ワーキングセットが物理メモリを超える
いつスケールすべきか? 
• 特定のリソースがマシン、もしくはレプリカ 
セット上でのボトルネックになった場合 
• RAM 
• ディスクI/O 
• ストレージ 
• コンカレンシー(Concurrency)
垂直スケール(スケールアップ)
水平スケール(スケールアウト)
シャーディング 
• ユーザがシャードキーを選択 
• シャードキーはデータレンジを定義 
• シャードキーに従ってデータはシャード毎にパ 
ティションされる
スケーラビリティ 
40 
自動シャーディング 
シャード1 シャード2 シャード3 シャードN 
水平スケール 
• キャパシティを自由に拡張 
• コモディティサーバやクラウドアーキテクチャに最適 
• 容易な運用とコストの明確化がメリット

More Related Content

PDF
Ingress on Azure Kubernetes Service
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PPTX
WiredTigerを詳しく説明
PPTX
SQLチューニング入門 入門編
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
MySQL負荷分散の方法
PPTX
マイクロサービスにおける 結果整合性との戦い
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Ingress on Azure Kubernetes Service
コンテナの作り方「Dockerは裏方で何をしているのか?」
WiredTigerを詳しく説明
SQLチューニング入門 入門編
Dockerfileを改善するためのBest Practice 2019年版
MySQL負荷分散の方法
マイクロサービスにおける 結果整合性との戦い
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー

What's hot (20)

PPTX
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
3分でわかるAzureでのService Principal
PDF
Vacuum徹底解説
PPTX
MongoDBが遅いときの切り分け方法
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
PostgreSQL:行数推定を読み解く
PDF
分散システムの限界について知ろう
PDF
10分でわかる Cilium と XDP / BPF
PDF
できる!並列・並行プログラミング
PPTX
これがCassandra
PDF
今さらだけどMySQLとライセンス
PDF
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PDF
SQL大量発行処理をいかにして高速化するか
PDF
DockerとPodmanの比較
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
PostgreSQLアンチパターン
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
3分でわかるAzureでのService Principal
Vacuum徹底解説
MongoDBが遅いときの切り分け方法
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
爆速クエリエンジン”Presto”を使いたくなる話
ヤフー社内でやってるMySQLチューニングセミナー大公開
PostgreSQL:行数推定を読み解く
分散システムの限界について知ろう
10分でわかる Cilium と XDP / BPF
できる!並列・並行プログラミング
これがCassandra
今さらだけどMySQLとライセンス
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
SQL大量発行処理をいかにして高速化するか
DockerとPodmanの比較
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PostgreSQLアンチパターン
Ad

Viewers also liked (13)

PDF
MongoDB全機能解説1
PDF
MongoDB very basic (Japanese) / MongoDB基礎の基礎
PDF
20110514 mongo dbチューニング
PPTX
MongoDB on AWSクラウドという選択
PDF
MongoDB〜その性質と利用場面〜
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PPTX
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
PDF
ソーシャルゲームのためのデータベース設計
PPTX
初心者向けMongoDBのキホン!
PPTX
Node.js×mongo dbで3年間サービス運用してみた話
PDF
月間10億pvを支えるmongo db
PDF
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
MongoDB全機能解説1
MongoDB very basic (Japanese) / MongoDB基礎の基礎
20110514 mongo dbチューニング
MongoDB on AWSクラウドという選択
MongoDB〜その性質と利用場面〜
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
ソーシャルゲームのためのデータベース設計
初心者向けMongoDBのキホン!
Node.js×mongo dbで3年間サービス運用してみた話
月間10億pvを支えるmongo db
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
Ad

Similar to MongoDB: システム可用性を拡張するインデクス戦略 (20)

PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PDF
Introduction to MongoDB
PDF
Search on AWS - IVS CTO Night and Day 2016 Spring
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
PDF
Mongodb 紹介
PDF
Spring Data in a Nutshell
PPT
Mongodb
PPTX
Fundamentals of Relational Database Management Systems chapter19
PDF
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
PDF
MongoDB勉強会資料
PDF
Fess/Elasticsearchを使った業務で使える?全文検索への道
PDF
20181031 springfest spring data geode
KEY
XPages 開発 Tips 百連発
PDF
Linux Namespace
PDF
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
PDF
RailsエンジニアのためのSQLチューニング速習会
PDF
Jubatusでマルウェア分類
PDF
A Tour of PostgreSQL
 
PDF
2019年度 若手技術者向け講座 NoSQL
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Introduction to MongoDB
Search on AWS - IVS CTO Night and Day 2016 Spring
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
Mongodb 紹介
Spring Data in a Nutshell
Mongodb
Fundamentals of Relational Database Management Systems chapter19
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
MongoDB勉強会資料
Fess/Elasticsearchを使った業務で使える?全文検索への道
20181031 springfest spring data geode
XPages 開発 Tips 百連発
Linux Namespace
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
RailsエンジニアのためのSQLチューニング速習会
Jubatusでマルウェア分類
A Tour of PostgreSQL
 
2019年度 若手技術者向け講座 NoSQL

More from ippei_suzuki (10)

PDF
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
PDF
日本語:近年のデータベース技術がもたらすビジネス収益 --Google-slides
PDF
日本語:開発者向けのMongo dbオペレーションガイド
PPTX
日本語:Mongo dbに於けるシャーディングについて
PDF
MongoDB日本語紹介資料
PDF
MongoDBご紹介:事例紹介もあり
PDF
MongoDB概要:金融業界でのMongoDB
PDF
次世代ITの時代に向けての提言:scamアーティストになれ!
PPT
Cloud Computing Business Model
PPT
Ippeis Cloud Computing Presentation(Tokyo2.0)
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
日本語:近年のデータベース技術がもたらすビジネス収益 --Google-slides
日本語:開発者向けのMongo dbオペレーションガイド
日本語:Mongo dbに於けるシャーディングについて
MongoDB日本語紹介資料
MongoDBご紹介:事例紹介もあり
MongoDB概要:金融業界でのMongoDB
次世代ITの時代に向けての提言:scamアーティストになれ!
Cloud Computing Business Model
Ippeis Cloud Computing Presentation(Tokyo2.0)

Recently uploaded (10)

PDF
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
PDF
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略
PDF
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
PDF
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
PDF
細胞培養用バイオリアクターおよび発酵槽市場規模の成長見通し:2031年には2823百万米ドルに到達へ
PDF
Qlik TECH TALK セミナー:What's New In Qlik ~ 2025年7月リリース最新機能のご紹介
PDF
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
PDF
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
PDF
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
PDF
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
細胞培養用バイオリアクターおよび発酵槽市場規模の成長見通し:2031年には2823百万米ドルに到達へ
Qlik TECH TALK セミナー:What's New In Qlik ~ 2025年7月リリース最新機能のご紹介
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告

MongoDB: システム可用性を拡張するインデクス戦略

Editor's Notes

  • #8: Look at 7 documents
  • #9: Queries, inserts and deletes: O(log(n)) time
  • #10: MongoDB's indexes are B-Trees. Lookups (queries), inserts and deletes happen in O(log(n)) time. TODO: Add a page describing what a B-Tree is???
  • #11: So this is helpful, and can speed up queries by a tremendous amount
  • #19: unique applies a uniqueness constant on duplicate values. dropDups will force the server to create a unique index by only keeping the first document found in natural order with a value and dropping all other documents with that value. dropDups will likely result in data loss!!! Make sure you know what it does before you use it. MongoDB doesn't enforce a schema – documents are not required to have the same fields. Sparse indexes only contain entries for documents that have the indexed field. Without sparse, documents without field 'a' have a null entry in the index for that field. With sparse a unique constraint can be applied to a field not shared by all documents. Otherwise multiple 'null' values violate the unique constraint.
  • #22: cursor – the type of cursor used. BasicCursor means no index was used. TODO: Use a real example here instead of made up numbers… n – the number of documents that match the query nscannedObjects – the number of documents that had to be scanned nscanned – the number of items (index entries or documents) examined millis – how long the query took Ratio of n to nscanned should be as close to 1 as possible.
  • #23: cursor – the type of cursor used. BasicCursor means no index was used. TODO: Use a real example here instead of made up numbers… n – the number of documents that match the query nscannedObjects – the number of documents that had to be scanned nscanned – the number of items (index entries or documents) examined millis – how long the query took Ratio of n to nscanned should be as close to 1 as possible.
  • #36: Indexes should be contained in working set.
  • #38: From mainframes, to RAC Oracle servers... People solved problems by adding more resources to a single machine.
  • #39: Large scale operation can be combined with high performance on commodity hardware through horizontal scaling Build - Document oriented database maps perfectly to object oriented languages Scale - MongoDB presents clear path to scalability that isn't ops intensive - Provides same interface for sharded cluster as single instance