๊ณํ ๊ฒฐ๊ณผ ์ค๋ช ํด์
์ด ํ์ด์ง์ ๋ด์ฉ
๊ฒฐ๊ณผ ์ค๋ช ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์ ๋ํ ๋ค์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ
์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํด ์ค์บํ ๋ฌธ์ ๋ฐ ์ธ๋ฑ์ค ํค์ ์
์ฐธ๊ณ
์ฟผ๋ฆฌ์ ๋ํ ๊ณํ ๊ฒฐ๊ณผ ์ค๋ช ์ MongoDB ๋ฒ์ ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
cursor.explain("executionStats")
๋ฐ db.collection.explain("executionStats")
๋ฉ์๋๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ํ ํต๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํต๊ณ๋ ์ฟผ๋ฆฌ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๋ฐฉ๋ฒ์ ์ธก์ ํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ db.collection.explain()
๋ฅผ ์ฐธ์กฐํ์ธ์.
MongoDB Compass ๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ํ ํต๊ณ๋ฅผ ํ์ํ๋ Explain Plan ํญ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํต๊ณ๋ ์ฟผ๋ฆฌ ์์ ์ธ๋ฑ์ค ๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๋ฐฉ๋ฒ์ ์ธก์ ํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ์ฑ๋ฅ ํ๊ฐ
๋ค์ ๋ฌธ์๊ฐ ํฌํจ๋ inventory
์ปฌ๋ ์
์ ์๊ฐํด ๋ณด์ธ์.
{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 } { "_id" : 2, "item" : "f2", type: "food", quantity: 100 } { "_id" : 3, "item" : "p1", type: "paper", quantity: 200 } { "_id" : 4, "item" : "p2", type: "paper", quantity: 150 } { "_id" : 5, "item" : "f3", type: "food", quantity: 300 } { "_id" : 6, "item" : "t1", type: "toys", quantity: 500 } { "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 } { "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 } { "_id" : 9, "item" : "t2", type: "toys", quantity: 50 } { "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
ํด๋น ๋ฌธ์๋ MongoDB Compass์ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
์ธ๋ฑ์ค๊ฐ ์๋ ์ฟผ๋ฆฌ
๋ค์ ์ฟผ๋ฆฌ๋ quantity
ํ๋์ ๊ฐ์ด 100
~ 200
์ฌ์ด์ธ ๋ฌธ์๋ฅผ ๊ฒ์ํฉ๋๋ค.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
์ด ์ฟผ๋ฆฌ๋ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 } { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
์ ํํ ์ฟผ๋ฆฌ ๊ณํ์ ๋ณด๋ ค๋ฉด cursor.explain("executionStats")
์ปค์ ๋ฉ์๋๋ฅผ find ๋ช
๋ น์ ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain()
๋ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'COLLSCAN', ... } } }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 0, totalDocsExamined: 10, executionStages: { stage: 'COLLSCAN', ... }, ... }, ... }
์ปฌ๋ ์ ์ค์บ์ ๋ํ๋ด๊ธฐ ์ํด
queryPlanner.winningPlan.queryPlan.stage
์์COLLSCAN
์ ํ์ํฉ๋๋ค.์ปฌ๋ ์ ์ค์บ์
mongod
๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ์ฒด ์ปฌ๋ ์ ๋ฌธ์๋ฅผ ๋ฌธ์๋ณ๋ก ์ค์บํด์ผ ํจ์ ๋ํ๋ ๋๋ค. ์ด ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด๋ฉฐ ์ฟผ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค.executionStats.nReturned
์(๋)3
์(๋ฅผ) ํ์ํ์ฌ ์ฐ์นํ ์ฟผ๋ฆฌ ๊ณํ์ด 3๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.executionStats.totalKeysExamined
๊ฐ0
์ ํ์ํ์ฌ ์ด ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋ํ๋ ๋๋ค.executionStats.totalDocsExamined
๊ฐ10
์ ํ์ํ์ฌ MongoDB๊ฐ ์ผ์นํ๋ 3๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ๊ธฐ ์ํด 10๊ฐ์ ๋ฌธ์(์ฆ, ์ปฌ๋ ์ ์ ๋ชจ๋ ๋ฌธ์ ์ค์บ)๋ฅผ ์ค์บํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ quantity
ํ๋์ ๊ฐ์ด 100
~ 200
์ฌ์ด์ธ ๋ฌธ์๋ฅผ ๊ฒ์ํฉ๋๋ค.
๋ค์ ํํฐ๋ฅผ Compass ์ฟผ๋ฆฌ ํ์์ค์ ๋ณต์ฌํ๊ณ Find๋ฅผ ํด๋ฆญํฉ๋๋ค.
{ quantity: { $gte: 100, $lte: 200 } }
์ด ์ฟผ๋ฆฌ๋ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
์ ํํ ์ฟผ๋ฆฌ ๊ณํ์ ๋ณด๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
test.inventory
collection์ Explain Planํญ์ ํด๋ฆญํฉ๋๋ค.
Explain๋ฅผ ํด๋ฆญํฉ๋๋ค.
MongoDB Compass๋ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ ๊ณํ์ ํ์ํฉ๋๋ค.
์ฐธ๊ณ
์ด ํํ ๋ฆฌ์ผ์์๋ ๋งค์ฐ ์์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ Actual Query Execution Time์ 0
์ด๋ฅผ ํ์ํฉ๋๋ค.
๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์์๋ ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ์ ์ธ๋ฑ์ฑ๋์ง ์์ ์ฟผ๋ฆฌ ๊ฐ์ ์ฟผ๋ฆฌ ์คํ ์๊ฐ ์ฐจ์ด๊ฐ ํจ์ฌ ํด ๊ฒ์ ๋๋ค.
์๊ฐ์ ํธ๋ฆฌ
Query Performance Summary์(๋) ์ฟผ๋ฆฌ์ ์คํ ํต๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Documents Returned ์
3
์ ํ์ํ์ฌ ์ฑ๊ณต์ ์ธ ์ฟผ๋ฆฌ ๊ณํ ์ด ์ธ ๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํํจ์ ๋ํ๋ ๋๋ค.Index Keys Examined ์(๋)
0
์(๋ฅผ) ํ์ํ์ฌ ์ด ์ฟผ๋ฆฌ ๊ฐ ์ธ๋ฑ์ค ๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์์ ๋ํ๋ ๋๋ค.Documents Examined์(๋)
10
์(๋ฅผ) ํ์ํ์ฌ MongoDB๊ฐ ์ผ์นํ๋ 3๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ๊ธฐ ์ํด10๊ฐ์ ๋ฌธ์(์ฆ, ์ปฌ๋ ์ ์ ๋ชจ๋ ๋ฌธ์ ์ค์บ)๋ฅผ ์ค์บํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
Query Performance Summary ์๋์ MongoDB Compass๋
COLLSCAN
์ฟผ๋ฆฌ ๋จ๊ณ๋ฅผ ํ์ํ์ฌ ์ด ์ฟผ๋ฆฌ์ ์ปฌ๋ ์ ์ค์บ์ด ์ฌ์ฉ๋์์์ ๋ํ๋ ๋๋ค.์ปฌ๋ ์ ์ค์บ์
mongod
๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ์ฒด ์ปฌ๋ ์ ๋ฌธ์๋ฅผ ๋ฌธ์๋ณ๋ก ์ค์บํด์ผ ํจ์ ๋ํ๋ ๋๋ค. ์ด ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด๋ฉฐ ์ฟผ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค.
Raw JSON
์ฟผ๋ฆฌ ํ์์ค ์๋์ Raw JSON์ ํด๋ฆญํ์ฌ ์์ JSON ํ์์ผ๋ก ์ค๋ช ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณผ ์๋ ์์ต๋๋ค.
์ผ์นํ๋ ๋ฌธ์ ์์ ๊ฒํ ๋ ๋ฌธ์ ์์ ์ฐจ์ด๋ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฟผ๋ฆฌ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์์ ์์ฌํ ์ ์์ต๋๋ค.
์ธ๋ฑ์ค๊ฐ ์๋ ์ฟผ๋ฆฌ
quantity
ํ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ ค๋ฉด quantity
ํ๋์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
db.inventory.createIndex( { quantity: 1 } )
์ฟผ๋ฆฌ ๊ณํ ํต๊ณ๋ฅผ ๋ณด๋ ค๋ฉด explain()
๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain()
๋ฉ์๋๋ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 3, totalDocsExamined: 3, executionStages: { ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.inputStage.stage
๊ฐIXSCAN
์ ํ์ํด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํจ์ ๋ํ๋ ๋๋ค.executionStats.nReturned
์(๋)3
์(๋ฅผ) ํ์ํ์ฌ ์ฐ์นํ ์ฟผ๋ฆฌ ๊ณํ์ด 3๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.executionStats.totalKeysExamined
๊ฐ3
์ ํ์ํด MongoDB๊ฐ ์ธ ๊ฐ์ ์ธ๋ฑ์ค ํญ๋ชฉ์ ์ค์บํ์์ ๋ํ๋ ๋๋ค. ๊ฒ์ฌํ ํค์ ์๋ ๋ฐํ๋ ๋ฌธ์ ์์ ์ผ์นํฉ๋๋ค. ์ฆ,mongod
ํจ์๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์ธ๋ฑ์ค ํค๋ง์ ๊ฒ์ํ์์๋ํ๋ ๋๋ค.mongod
๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ค์บํ ํ์๊ฐ ์์๊ณ ์ผ์นํ๋ ๋ฌธ์ 3๊ฐ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋งค์ฐ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค.executionStats.totalDocsExamined
๋3
์ ํ์ํด MongoDB๊ฐ ๋ฌธ์ 3๊ฐ๋ฅผ ์ค์บํ์์ ๋ํ๋ ๋๋ค.
test.inventory
collection์ Indexesํญ์ ํด๋ฆญํฉ๋๋ค.
Create Index๋ฅผ ํด๋ฆญํฉ๋๋ค.
Select a field name
๋๋กญ๋ค์ด ๋ฉ๋ด์์
quantity
์(๋ฅผ) ์ ํํฉ๋๋ค.์ ํ ๋๋กญ๋ค์ด ๋ฉ๋ด์์
1 (asc)
๋ฅผ ์ ํํฉ๋๋ค.Create๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ฐธ๊ณ
์ธ๋ฑ์ค ์ด๋ฆ ํ๋๋ฅผ ๋น์๋๋ฉด MongoDB Compass๊ฐ ์ธ๋ฑ์ค์ ๊ธฐ๋ณธ ์ด๋ฆ์ ์์ฑํฉ๋๋ค.
์ด์ Indexes ํญ์์ ์๋ก ๋ง๋ ์ธ๋ฑ์ค๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
inventory
์ปฌ๋ ์
์ ๋ํ Explain Plan ํญ์ผ๋ก ๋์๊ฐ์ ์ด์ ๋จ๊ณ์ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ์คํํฉ๋๋ค.
{ quantity: { $gte: 100, $lte: 200 } }
MongoDB Compass๋ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ ๊ณํ์ ํ์ํฉ๋๋ค.
์๊ฐ์ ํธ๋ฆฌ
Query Performance Summary์(๋) ์ฟผ๋ฆฌ์ ์คํ ํต๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Documents Returned ์
3
์ ํ์ํ์ฌ ์ฑ๊ณต์ ์ธ ์ฟผ๋ฆฌ ๊ณํ ์ด ์ธ ๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํํจ์ ๋ํ๋ ๋๋ค.Index Keys Examined ์
3
์ ํ์ํ์ฌ MongoDB ๊ฐ ์ธ ๊ฐ์ ์ธ๋ฑ์ค ํญ๋ชฉ์ ์ค์บํ์์ ๋ํ๋ ๋๋ค. ๊ฒ์ฌํ ํค์ ์๊ฐ ๋ฐํ๋ ๋ฌธ์์ ์์ ์ผ์นํ๋ฏ๋กmongod
๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์ธ๋ฑ์ค ํค๋ง ๊ฒ์ฌํ๋ฉด ๋์์ต๋๋ค.mongod
๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ค์บํ ํ์๊ฐ ์์๊ณ , ์ผ์นํ๋ ๋ฌธ์ 3๊ฐ๋ง ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ฉด ๋์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋งค์ฐ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ ๊ฐ ์์ฑ๋ฉ๋๋ค.Documents Examined ์
3
์ ํ์ํ์ฌ MongoDB ๊ฐ ์ธ ๊ฐ์ ๋ฌธ์๋ฅผ ์ค์บํ์์ ๋ํ๋ ๋๋ค.Query Performance Summary์ ์ค๋ฅธ์ชฝ์์ MongoDB Compass๋ ์ฟผ๋ฆฌ๊ฐ
quantity
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์์ ๋ณด์ฌ์ค๋๋ค.
Query Performance Summary ์๋์์ MongoDB Compass๋ ์ฟผ๋ฆฌ ๋จ๊ณ์ธ
FETCH
์IXSCAN
์ ํ์ํฉ๋๋ค.IXSCAN
์mongod
๊ฐFETCH
๋จ๊ณ๋ฅผ ์คํํ๊ณ ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ธฐ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์์ ๋ํ๋ ๋๋ค.
Raw JSON
์ฟผ๋ฆฌ ํ์์ค ์๋์ Raw JSON์ ํด๋ฆญํ์ฌ ์์ JSON ํ์์ผ๋ก ์ค๋ช ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณผ ์๋ ์์ต๋๋ค.
์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์ฟผ๋ฆฌ๋ 10
๊ฐ ๋ฌธ์์ ์ ์ฒด ์ปฌ๋ ์
์ ์ค์บํ์ฌ 3
๊ฐ์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค. ๋ํ ์ฟผ๋ฆฌ๋ ๊ฐ ๋ฌธ์ ์ ์ฒด๋ฅผ ์ค์บํ์ฌ ์ ์ฌ์ ์ผ๋ก ํด๋น ๋ฌธ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์์ผ ํ์ต๋๋ค. ์ด๋ก ์ธํด ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์ฟผ๋ฆฌ ์์
์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด 3
๊ฐ์ ์ธ๋ฑ์ค ํญ๋ชฉ๊ณผ 3
๊ฐ์ ๋ฌธ์๋ฅผ ์ค์บํ์ฌ 3
๊ฐ์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๋ฐํํ๋ฏ๋ก ๋งค์ฐ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
์ธ๋ฑ์ค ์ฑ๋ฅ ๋น๊ต
๋ ์ด์์ ์ธ๋ฑ์ค ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ ์ฑ๋ฅ์ ์๋์ผ๋ก ๋น๊ตํ๋ ค๋ฉด hint()
๋ฉ์๋๋ฅผ explain()
๋ฉ์๋์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์๊ฐํด ๋ณด์ธ์.
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } )
์ด ์ฟผ๋ฆฌ๋ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 5, "item" : "f3", "type" : "food", "quantity" : 300 }
์ฟผ๋ฆฌ ์ง์ ํ๋ ค๋ฉด ๋ณตํฉ ์ธ๋ฑ์ค ์ถ๊ฐํฉ๋๋ค. ๋ณตํฉ ์ธ๋ฑ์ค์์๋ ํ๋์ ์์๊ฐ ์ค์ํฉ๋๋ค.
์์ ๋ค์ด, ๋ค์ ๋ ๊ฐ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค ๋จผ์ quantity
ํ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ค์ type
ํ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๋ ๋ฒ์งธ ์ธ๋ฑ์ค ๋จผ์ type
๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ค์ quantity
ํ๋ ์ ๋ ฌํฉ๋๋ค.
db.inventory.createIndex( { quantity: 1, type: 1 } ) db.inventory.createIndex( { type: 1, quantity: 1 } )
์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค ์ฟผ๋ฆฌ ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ฐํฉ๋๋ค.
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ quantity: 1, type: 1 }).explain("executionStats")
explain()
๋ฉ์๋๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1, type: 1 }, ... } } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 5, totalDocsExamined: 2, executionStages: { ... } }, ... }
MongoDB 5
๊ฐ์ ์ธ๋ฑ์ค ํค(executionStats.totalKeysExamined
)๋ฅผ ์ค์บํ์ฌ 2
๊ฐ์ ์ผ์นํ๋ ๋ฌธ์(executionStats.nReturned
)๋ฅผ ๋ฐํํ์ต๋๋ค.
๋ ๋ฒ์งธ ์ธ๋ฑ์ค ์ฟผ๋ฆฌ ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ฐํฉ๋๋ค.
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ type: 1, quantity: 1 }).explain("executionStats")
explain()
๋ฉ์๋๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
{ queryPlanner: { ... queryPlan: { winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { type: 1, quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 2, totalDocsExamined: 2, executionStages: { ... } }, ... }
MongoDB 2
๊ฐ์ ์ธ๋ฑ์ค ํค(executionStats.totalKeysExamined
)๋ฅผ ์ค์บํ์ฌ 2
๊ฐ์ ์ผ์นํ๋ ๋ฌธ์(executionStats.nReturned
)๋ฅผ ๋ฐํํ์ต๋๋ค.
๋ฐ๋ผ์ ๋ ๋ฒ์งธ ๋ณตํฉ ์ธ๋ฑ์ค { type: 1, quantity: 1 }
์ ์์ ์ฟผ๋ฆฌ ์ง์ํ๊ธฐ์ ๋ ํจ์จ์ ์ธ ์ธ๋ฑ์ค ์ด๋ฉฐ, MongoDB ์๋ฒ 5
์ ๋น๊ตํ์ ๋ ์ด ์ธ๋ฑ์ค ์ฌ์ฉํ์ฌ ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฐพ๊ธฐ ์ํด 2
index keys
๋ง ์ค์บํ๋ฉด ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ณตํฉ ์ธ๋ฑ์ค
{ quantity: 1, type: 1 }
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ.
๋ค์๋ ์ฐธ์กฐํ์ธ์.
๋ค์๋ ์ฐธ์กฐํ์ธ์.