SlideShare a Scribd company logo
1 of 40
システム可用性を拡張するイン 
デクス戦略 
鈴木いっぺい 
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

What's hot

BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?Masahito Zembutsu
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
Planet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: BigdamPlanet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: BigdamSATOSHI TAGOMORI
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48Preferred Networks
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンスHidenori Ishii
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)NTT DATA Technology & Innovation
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法Masahito Zembutsu
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...Google Cloud Platform - Japan
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 

What's hot (20)

BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
Planet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: BigdamPlanet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: Bigdam
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 

Viewers also liked

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

Viewers also liked (12)

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

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

問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイドTakahiro Itagaki
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会Satoshi Nagayasu
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBmoai kids
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringEiji Shinohara
 
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーションYoshifumi Kawai
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a NutshellTsuyoshi Miyake
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
Fundamentals of Relational Database Management Systems chapter19
Fundamentals of Relational Database Management Systems chapter19Fundamentals of Relational Database Management Systems chapter19
Fundamentals of Relational Database Management Systems chapter19Keisuke Suzuki
 
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法de:code 2017
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Shinsuke Sugaya
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geodeMasaki Yamakawa
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"Kentaro Yoshida
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類Shuzo Kashihara
 

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

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

More from ippei_suzuki

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

More from ippei_suzuki (10)

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

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

Editor's Notes

  1. Look at 7 documents
  2. Queries, inserts and deletes: O(log(n)) time
  3. 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???
  4. So this is helpful, and can speed up queries by a tremendous amount
  5. 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.
  6. 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.
  7. 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.
  8. Indexes should be contained in working set.
  9. From mainframes, to RAC Oracle servers... People solved problems by adding more resources to a single machine.
  10. 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