DOing
์ ์ฐ๊ณ ์๋ MySQL ๋์ MongoDB๋ฅผ ๋์ ํ ์ฐ.ssul ๋ณธ๋ฌธ
์ ์ฐ๊ณ ์๋ MySQL ๋์ MongoDB๋ฅผ ๋์ ํ ์ฐ.ssul
mangdo 2022. 11. 5. 20:54์ฌ๋ด์์๋ ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ MySQL, ์ฌ์ฉ๋ชฉ์ ์ ๋ง๊ฒ Redis, Elastic Search, Bigquery ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ณ ์๋ค. ํ์ง๋ง, ์๋ก์ด ์๊ตฌ์ฌํญ์ ๋ฐ์ดํฐ์ ์ ์ฌ๊ฐ ํ์ํ ์ํฉ์ ๋ง์ดํ๊ฒ ๋์๋ค. ์ผ๋จ ์ด์ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ ค ๋ฃ์๊น ์์งํ ๊ณ ๋ฏผํ์ง๋ง, ์๊ฐํ๋ฉด ์๊ฐํ ์๋ก ์๊ตฌ์ฌํญ์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์๊ณ , ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ MongoDB๋ฅผ ๋์ ํ๊ฒ ๋์๋ค. ์ค๋์ ๊ทธ ์ฐ์ ํ์ด๋ณผ๊น ํ๋ค.

๋น์ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์๋ค.
โข ๋ฐฉ๋ํ ์์ ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํด์ผํ๋ ์ํฉ (feat.ํ๋ก์ ๊ธฐ๋ฐ ํผ๋ ์ํคํ ์ฒ ์ค๊ณํ๊ธฐ)
โข ์ ํฉ์ฑ์ ์กฐ๊ธ ๋จ์ด์ง๋๋ผ๋, ๊ณ ๊ฐ์ฉ์ฑ์ ์ง์ํด์ผํ๋ค.
โข ๋ฐ์ดํฐ ํฌ๋งท์ด ํฅํ ๋ฌ๋ผ์ง ๊ฐ๋ฅ์ฑ์ด ์์ด์ ์ ์ฐํ ์คํค๋ง ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
โข ๋ฐฉ๋ํ ์์ ๊ฐ๋นํ ์ ์๋๋ก ๋์ ํ์ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค.
โข ์์ฒญ๋ ๋น๋์ ์ฐ๊ธฐ ์ฐ์ฐ์ ๊ฐ๋นํ ์ ์๋ค.
โข ์กฐ์ธ์ ํ์์๋ค.
MongoDB ์ฅ์
โข ๋ฐ์ด๋ Read/Write ์ฑ๋ฅ
โข ๋์ ํ์ฅ์ฑ
โข ๋ฐ์ดํฐ์ ํธ๋ํฝ ์ฆ๊ฐ์ ๋ฐ๋ผ ์ํํ์ฅ(scale-out) ๊ฐ๋ฅ
โข MongoDB๋ ๋ฐ์ดํฐ ์ค๋ฉ์ ์ง์
โข ์ด๋ฌํ ์ค๋ฉ๊ณผ์ ์ ์๋น์ค ์ค๋จ์์ด ์จ๋ผ์ธ์ผ๋ก ์งํ๋๋ค. ๋ง์ฝ ํน์ ์ค๋์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ฆฌ๋ฉด ๋ค๋ฅธ ์ค๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ ์์ผ ์ ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ค๋๊ฐ ๊ท ๋ฑํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํด์ฃผ๋ฉฐ, ์ด๋ฌํ ๋์์ ๋ฐธ๋ฐ์ฑ์ด๋ผ๊ณ ํ๋ค.
โข ์คํค๋ง ํ๋ฆฌ
โข ์ฌ์ฉํ ์ปฌ๋ผ์ ๋ฏธ๋ฆฌ ์ ์ํ์ง ์๊ณ ์ธ์ ๋ ์ง ํ์ํ ์์ ์ ๋ฐ์ดํฐ ์ ์ฅ๊ฐ๋ฅํ๋ค.
โข ํ์ง๋ง MongoDB๋ ๋ชจ๋ ๋ถ๋ถ์ ์์ด์ ์คํค๋ง ํ๋ฆฌ๋ผ๊ณ ๋ณด๊ธฐ๋ ์ด๋ ต๋ค, MongoDB๋ ๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์๋๋ฐ, ๋ณด์กฐ์ธ๋ฑ์ค๋ ์คํค๋ง ํ๋ฆฌ๊ฐ ์๋๋ผ ํญ์ ์ธ๋ฑ์ค๋ฅด ๊ตฌ์ฑํ๋ ํ๋๋ฅผ ์ ์ํด์ผํ๋ค.
MongoDB ๋จ์
โข ๋ณต์กํ Join ์ฌ์ฉ์ ์ฑ๋ฅ ์ ์ฝ
โข RDBMS์ ๊ฐ์ง๋ ์์ง๋ง Aggregation ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด RDBMS์ ๋น์ทํ ํํ์ ์กฐ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค. ํ์ง๋ง ์ค๋ฉ ํ๊ฒฝ์์๋ ์ฑ๋ฅ์ด ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ์ง ์๋๋ค๊ณ ํ๋ค.
โข ํธ๋์ญ์ ์ง์
โข MongoDB 4.0์ด ๋ฆด๋ฆฌ์ฆ ๋๋ฉด์ Replica Set์์ ์๋ํ๋ ๋ค์ค ๋ํ๋จผํธ ํธ๋์ญ์ ์ ๋ํ ์ง์์ ์ถ๊ฐ๋์๋ค.
โข ๋, MongoDB 4.2์ ๋ฆด๋ฆฌ์ค์ ํจ๊ป ๋ค์ค ๋ํ๋จผํธ ํธ๋์ญ์ ์ ๋ํ ์ง์์ด Sharded Cluster๋ก ํ์ฅ๋์๋ค.
โข (์ง์ ๋ฒ์ ์ด ์์ ํ ๋ฒ์ , ํ์๋ ๊ฐ๋ฐ์ค์ธ ๋ฒ์ )
โข ํ์ง๋ง ํธ๋์ญ์ ์ง์์ด RDBMS ๋ณด๋ค๋ ๋ฏธ์ฝํ๋ค.
MongoDB ํน์ง
โข BSON ํํ๋ก ์ ์ฅ
โข JSON ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ ์ฅํ๋ ๊ฒ์ด์๋, BSON(Binary Json)์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ฏ๋ก ๊ณต๋ฐฑ์ด๋ ๋งํฌ์ ๋ฌธ์๋ก ์ธํด ๋ถ๊ฐ์ ์ผ๋ก ์ ์ฅ๊ณต๊ฐ์ด ๋ณํ์ง ์๋๋ค.
โข ์ปค์ ์ฌ์ฉ
โข MongoDB๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ์ปค์๋ฅผ ์ฌ์ฉ, ์ด ์ปค์๋ฅผ ํตํด์ ๋ฐ๋ณต์ ์ผ๋ก ์ค์ ๋ํ๋จผํธ (๋ ์ฝ๋)๋ฅผ ๊ฐ์ง๊ณ ์ฌ ์ ์๋ค.
โข MongoDB์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ์ปค์๋ฅผ ๋ฐํํ๋ ์ด์ ๋ ์ฟผ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ํด๋ฆฌ์์ด์ธํธ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ด์๋์ง ์์๋ ์ฒ๋ฆฌํ ์ ์๊ฒํ๊ธฐ ์ํด์๋ค. ๋ฌผ๋ก ์ปค์๋ฅผ ์ฝ์๋๋ง๋ค ๊ทธ๋๋ง๋ค ๋ํ๋จผํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋๊ณ ํ์ํ ๋๋ง๋ค ์ง์ ๋ ํ์ด์ง ์ฌ์ด์ฆ ๋จ์๋ก ์๋ฒ๋ก๋ถํฐ ์ ์ก๋ฐ์ MongoDB ํด๋ผ์ด์ธํธ ์๋ฒ์ ์บ์ฑํ ํ์ ์ ์ ์๊ฒ ์๋น์คํ๋ ๊ฒ์ด๋ค.
๋ ํ๋ฆฌ์นด์ ๊ตฌ์ฑ ๋ฐฉ๋ฒ

โข ํ๋ผ์ด๋จธ๋ฆฌ, ์ผ์ปจ๋๋ฆฌ. ์๋นํฐ ์กฐํฉ!
โข ์๋นํฐ๋?
: ์๋นํฐ ๋ชจ๋๋ก ์์๋ ๋ชฝ๊ณ ๋๋น๋ ๋ ํ๋ฆฌ์นด ์ ์ ๋ ธ๋๋ค๊ณผ ํํธ๋นํธ๋ง ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ง ์๋๋ค. ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ๋ถ๋ฅ์ผ๋ ํ๋ผ์ด๋จธ๋ฆฌ ๋ ธ๋์ ์ ์ถ์๋ง ์ฐธ์ฌํ๋ค.
๋์ ์ ์ฃผ์์ 1) ์ฌ๋ก์ฐ์ฟผ๋ฆฌ ์ค์
[ MongoDB ๋ก๊ทธํ์ผ ]
100๋ฐ๋ฆฌ์ด๊ฐ ๋๊ฒ ๊ฑธ๋ฆฐ ์ฟผ๋ฆฌ๋ MongoDB ์๋ฒ์ ๋ก๊ทธํ์ผ์ ๋ชจ๋ ๋ก๊น ๋๋ค. 100๋ฐ๋ฆฌ์ด๋ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ, MongoDB ์๋ฒ์ ์ค์ ํ์ผ์์ slowMs ์ต์ ์ ์กฐ์ ํ๋ฉด๋๋ค. MongoDB ์๋ฒ์ ๋ก๊ทธ๋ ๋ฒจ์ ๋ํดํธ ๊ฐ ๋ณด๋ค ๋ ์์ธํ ๋๋ ๋ ๋จ์ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด db.setLogLevel()๋ช ๋ น์ ํตํด ์๋ธ ๋ชจ๋๋ณ๋ก ๋ก๊ทธ๋ ๋ฒจ์ ์กฐ์ ํ ์ ์๋ค. MongoDB ๋ก๊ทธ ์ฌ์ฉ์ ์ฃผ์์ ์ ๋ก๊ทธ์ ์ฌ์ด์ฆ๊ฐ ๋ฌด์ ํ์ผ๋ก ๋์ด๋๋ค๋ ๊ฒ์ด๋ค.์ด๋๋ฌธ์ ์ฉ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋, logrotate ์ค์ ์ด ํ์ํ๋ค.[1] ์ด๋ฒ ํฌ์คํ ์ด ๋๋ฌด ๊ธธ์ด์ ธ์ ๋ค๋ฅธ ํฌ์คํ ์์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํด๋์๋ค. MongoDB์ Logrotate ์ค์ ํ๊ธฐ
db.setLogLevel(1); | |
// ๊ตฌ์ฑ ์์์ ๋ํ ์์ธ ์์ค ์ค์ | |
// systemLog.component.storage.journal.verbosity์ ๋ํด์ 2๋ก ์ค์ | |
db.setLogLevel(2, "storage.journal"); |
[ MongoDB ์ฟผ๋ฆฌ ํ๋กํ์ผ๋ง ]
MongoDB ์๋ฒ์ ๋ก๊ทธ ํ์ผ์๋ ๋งค์ฐ ๋ง์ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์ด ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ์์ง์ด ์ด๋ ค์ธ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ๋ก ์ ์ฅ๋๋ ์ฟผ๋ฆฌ ํ๋กํ์ผ๋ง์ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค. MongoDB๋ 100ms ์ด์ ๊ฑธ๋ฆฐ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ์ ๋ํด์ ํด๋น ์ปฌ๋ ์ ์ด ์กด์ฌํ๋ DB์ system.profile ์ปฌ๋ ์ ์ ๊ธฐ๋กํ๋ค.
โข ํ๋กํ์ผ๋ง ๋ ๋ฒจ ์กฐ์
โข ์ฃผ์ ) MongoDB์ ๋ก๊ทธํ์ผ์๋ ์ ์ฉ๋์ง ์๊ณ , system.profile ์ปฌ๋ ์ ์ ๊ธฐ๋ก๋๋ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊น ์๋ง ์ ์ฉ๋๋ค.
db.getProfilingStatus() | |
db.setProfilingLevel(1, 100) // ์คํ์๊ฐ์ด 100ms ์ด์ ๊ฑธ๋ฆฐ ์ฟผ๋ฆฌ๋ง ๋ก๊น | |
// ์คํ ์๊ฐ ์๊ด์์ด ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ก๊น | |
db.setProfilingLevel(2) |
โข ์ ํ ์ฉ๋
system.profile์ 1MB ์ ๋์ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ๋ง ์ ์ฅํ ์ ์๋ค. 1MB ์ด์๋๋ฉด, ์ค๋๋ ๋ก๊ทธ๋ถํฐ ์ญ์ ํ๋ค.
โข ์๊ฐ์ ์ ๋ ฌํ์ฌ ํ์ธ ์ฟผ๋ฆฌ
์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ํ์ธํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ญ์์ผ๋ก ์ ๋ ฌํด์ผ ์๊ฐ์์ผ๋ก ํธํ ๋ณผ ์ ์๋ค.
db.system.profile.find().sort({$natural:-1}).limit(3).pretty() |
[ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ถ์ ]
์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ์์ ์ฃผ๋ก ์ฑ๋ฅ๊ณผ ๊ด๋ จํด์ ์ดํด๋ด์ผํ๋ ๋ถ๋ถ
โข planSummary
: ์ฟผ๋ฆฌ์ ์คํ ๊ณํ
โข keysExamined
: ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ์ธ๋ฑ์ค์์ ์ฝ์ ์ธ๋ฑ์ค ํค์ ๊ฐ์
โข docsExamined
: ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ์ปฌ๋ ์ ์ ๋ฐ์ดํฐ ํ์ผ์์ ์ฝ์ ๋ํ๋จผํธ์ ๊ฐ์
โข numYields
โข Yield : ์ฅ์๊ฐ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฉด ๋ค๋ฅธ ์ปค๋ฅ์ ๋ค์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋๋ก ์ ๊ธ์ ํด์ ํ๋ค๊ฐ ๋ค์ ์ ๊ธ์ ํ๋ํ๋ ๊ณผ์
โข ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋์ค์์ ๊ธ์ ์ผ๋ง๋ ํ๋ํ๋๊ฐ๋ฅผ ์๋ฏธ
๋์ ์ ์ฃผ์์ 2) ์ฟผ๋ฆฌ ์คํ๊ณํ ๋ถ์ + ์ธ๋ฑ์ค ์ค์
์ฒ์ ์ฌ์ฉํด๋ณด๋ Database๋ค๋ณด๋, ์ฟผ๋ฆฌ ์คํ๊ณํ์ ์์ธกํ๊ธฐ ์ด๋ ค์ ๋ค. ๋๋ฌธ์ ์ธ๋ฑ์ค ์ค์ ์๋ ๊ณ ๋ฏผ์ด ๋์์๋ค. ์ฌ์ฉํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ํ๋์ฉ ๋๋ ค๊ฐ๋ฉด์ ์คํ๊ณํ์ ๋ถ์ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์คฌ์๋ค. ์ด๋ฒ ํฌ์คํ ์ด ๋๋ฌด ๊ธธ์ด์ ธ์ ๋ค๋ฅธ ํฌ์คํ ์์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํด๋์๋ค. MongoDB์์ ์คํ ๊ณํ ํ์ธํ๋ ๋ฐฉ๋ฒ

๋์ ์ ์ฃผ์์ 3) op: 'getmore' + batchSize
MongoDB ํด๋ผ์ด์ธํธ๋ ๊ธฐ๋ณธ ๋ฐฐ์น ํฌ๊ธฐ(default batch size)๊ฐ ์ค์ ๋์ด์๊ณ , ํ์์ ๋ฐ๋ผ ์ด ๊ฐ์ ๋ณ๊ฒฝํด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. ์ฟผ๋ฆฌ๋ก๊ทธ๋ฅผ ํ๋์ฉ ๋ณด๋ค๋ณด๋ op:getmore ์ด ๋น์ ์์ ์ผ๋ก ๋ง์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ , ์ด๋ฅผ ์์ ํ์์ต๋๋ค. ์๋ MongoDB์์๋ batchSize๋ limit์ ์ ํด์ฃผ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก batchSize๋ฅผ 101๋ก ์ง์ ํ๋ค. (batch ํ๋ฒ๋น ๋ฐ์ดํฐ๊ฐ 1MB๊ฐ ๋์ด๊ฐ์ง ์๋ ์ ์์) ํ์ง๋ง ๋น์ ์ฌ์ฉํ๋ MongoDB ํด๋ผ์ด์ธํธ์์ batchSize์ default๊ฐ 2์๊ธฐ ๋๋ฌธ์ getMore๋ฅผ ๊ณ์ ์คํํ๋ค๋ ๋ฌธ์ ์ ์ด ์์๋ค. ์ค์ ๋ก LINE ๊ธฐ์ ๋ธ๋ก๊ทธ์์๋ ์ด๋๋ฌธ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฒช์๋ค๊ณ ํ๋ค. [3]
[ | |
{ | |
op: 'getmore', | |
ns: 'DB๋ช .์ปฌ๋ ์ ๋ช ', | |
command: { | |
getMore: Long("8919504496005620780"), | |
collection: '์ปฌ๋ ์ ๋ช ', | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584024, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
originatingCommand: { | |
find: '์ปฌ๋ ์ ๋ช ', | |
filter: { ์ปฌ๋ผ๋ช 1: 6180 }, | |
projection: { ์ปฌ๋ผ๋ช 2: 1, _id: 0 }, | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584014, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
cursorid: Long("8919504496005620780"), | |
keysExamined: 0, | |
docsExamined: 0, | |
cursorExhausted: true, | |
numYield: 0, | |
nreturned: 0, | |
locks: { | |
Global: { acquireCount: { r: Long("1") } }, | |
Mutex: { acquireCount: { r: Long("1") } } | |
}, | |
flowControl: {}, | |
readConcern: { level: 'local', provenance: 'implicitDefault' }, | |
responseLength: 233, | |
protocol: 'op_msg', | |
millis: 0, | |
planSummary: 'IXSCAN { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }', | |
execStats: { | |
stage: 'PROJECTION_COVERED', | |
nReturned: 46, | |
executionTimeMillisEstimate: 0, | |
works: 47, | |
advanced: 46, | |
needTime: 0, | |
needYield: 0, | |
saveState: 23, | |
restoreState: 23, | |
isEOF: 1, | |
transformBy: {}, | |
inputStage: { | |
stage: 'IXSCAN', | |
nReturned: 46, | |
executionTimeMillisEstimate: 0, | |
works: 47, | |
advanced: 46, | |
needTime: 0, | |
needYield: 0, | |
saveState: 23, | |
restoreState: 23, | |
isEOF: 1, | |
keyPattern: { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }, | |
indexName: 'idx_์ปฌ๋ผ๋ช 1_N_์ปฌ๋ผ๋ช 2', | |
isMultiKey: false, | |
multiKeyPaths: { ์ปฌ๋ผ๋ช 1: [], ์ปฌ๋ผ๋ช 2: [] }, | |
isUnique: false, | |
isSparse: false, | |
isPartial: false, | |
indexVersion: 2, | |
direction: 'forward', | |
indexBounds: { | |
์ปฌ๋ผ๋ช 1: [ '[6180, 6180]' ], | |
์ปฌ๋ผ๋ช 2: [ '[MinKey, MaxKey]' ] | |
}, | |
keysExamined: 46, | |
seeks: 1, | |
dupsTested: 0, | |
dupsDropped: 0 | |
} | |
}, | |
ts: ISODate("2022-05-26T16:53:48.026Z"), | |
client: '10.128.15.193', | |
allUsers: [], | |
user: '' | |
}, | |
{ | |
op: 'getmore', | |
ns: 'DB๋ช .์ปฌ๋ ์ ๋ช ', | |
command: { | |
getMore: Long("8919504496005620780"), | |
collection: '์ปฌ๋ ์ ๋ช ', | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584024, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
originatingCommand: { | |
find: '์ปฌ๋ ์ ๋ช ', | |
filter: { ์ปฌ๋ผ๋ช 1: 6180 }, | |
projection: { ์ปฌ๋ผ๋ช 2: 1, _id: 0 }, | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584014, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
cursorid: Long("8919504496005620780"), | |
keysExamined: 2, | |
docsExamined: 0, | |
numYield: 0, | |
nreturned: 2, | |
locks: { | |
Global: { acquireCount: { r: Long("1") } }, | |
Mutex: { acquireCount: { r: Long("1") } } | |
}, | |
flowControl: {}, | |
readConcern: { level: 'local', provenance: 'implicitDefault' }, | |
responseLength: 287, | |
protocol: 'op_msg', | |
millis: 0, | |
planSummary: 'IXSCAN { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }', | |
execStats: { | |
stage: 'PROJECTION_COVERED', | |
nReturned: 46, | |
executionTimeMillisEstimate: 0, | |
works: 46, | |
advanced: 46, | |
needTime: 0, | |
needYield: 0, | |
saveState: 22, | |
restoreState: 22, | |
isEOF: 0, | |
transformBy: {}, | |
inputStage: { | |
stage: 'IXSCAN', | |
nReturned: 46, | |
executionTimeMillisEstimate: 0, | |
works: 46, | |
advanced: 46, | |
needTime: 0, | |
needYield: 0, | |
saveState: 22, | |
restoreState: 22, | |
isEOF: 0, | |
keyPattern: { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }, | |
indexName: 'idx_์ปฌ๋ผ๋ช 1_N_์ปฌ๋ผ๋ช 2', | |
isMultiKey: false, | |
multiKeyPaths: { ์ปฌ๋ผ๋ช 1: [], ์ปฌ๋ผ๋ช 2: [] }, | |
isUnique: false, | |
isSparse: false, | |
isPartial: false, | |
indexVersion: 2, | |
direction: 'forward', | |
indexBounds: { | |
์ปฌ๋ผ๋ช 1: [ '[6180, 6180]' ], | |
์ปฌ๋ผ๋ช 2: [ '[MinKey, MaxKey]' ] | |
}, | |
keysExamined: 46, | |
seeks: 1, | |
dupsTested: 0, | |
dupsDropped: 0 | |
} | |
}, | |
ts: ISODate("2022-05-26T16:53:47.824Z"), | |
client: '10.128.15.193', | |
allUsers: [], | |
user: '' | |
}, | |
{ | |
op: 'getmore', | |
ns: 'DB๋ช .์ปฌ๋ ์ ๋ช ', | |
command: { | |
getMore: Long("8919504496005620780"), | |
collection: '์ปฌ๋ ์ ๋ช ', | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584024, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
originatingCommand: { | |
find: '์ปฌ๋ ์ ๋ช ', | |
filter: { ์ปฌ๋ผ๋ช 1: 6180 }, | |
projection: { ์ปฌ๋ผ๋ช 2: 1, _id: 0 }, | |
batchSize: 2, | |
'$db': 'DB๋ช ', | |
'$clusterTime': { | |
clusterTime: Timestamp({ t: 1653584014, i: 1 }), | |
signature: { | |
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), | |
keyId: Long("0") | |
} | |
}, | |
lsid: { id: UUID("40c94449-4136-4014-8f5a-93fdc0635af1") } | |
}, | |
cursorid: Long("8919504496005620780"), | |
keysExamined: 2, | |
docsExamined: 0, | |
numYield: 0, | |
nreturned: 2, | |
locks: { | |
Global: { acquireCount: { r: Long("1") } }, | |
Mutex: { acquireCount: { r: Long("1") } } | |
}, | |
flowControl: {}, | |
readConcern: { level: 'local', provenance: 'implicitDefault' }, | |
responseLength: 287, | |
protocol: 'op_msg', | |
millis: 0, | |
planSummary: 'IXSCAN { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }', | |
execStats: { | |
stage: 'PROJECTION_COVERED', | |
nReturned: 44, | |
executionTimeMillisEstimate: 0, | |
works: 44, | |
advanced: 44, | |
needTime: 0, | |
needYield: 0, | |
saveState: 21, | |
restoreState: 21, | |
isEOF: 0, | |
transformBy: {}, | |
inputStage: { | |
stage: 'IXSCAN', | |
nReturned: 44, | |
executionTimeMillisEstimate: 0, | |
works: 44, | |
advanced: 44, | |
needTime: 0, | |
needYield: 0, | |
saveState: 21, | |
restoreState: 21, | |
isEOF: 0, | |
keyPattern: { ์ปฌ๋ผ๋ช 1: 1, ์ปฌ๋ผ๋ช 2: 1 }, | |
indexName: 'idx_์ปฌ๋ผ๋ช 1_N_์ปฌ๋ผ๋ช 2', | |
isMultiKey: false, | |
multiKeyPaths: { ์ปฌ๋ผ๋ช 1: [], ์ปฌ๋ผ๋ช 2: [] }, | |
isUnique: false, | |
isSparse: false, | |
isPartial: false, | |
indexVersion: 2, | |
direction: 'forward', | |
indexBounds: { | |
์ปฌ๋ผ๋ช 1: [ '[6180, 6180]' ], | |
์ปฌ๋ผ๋ช 2: [ '[MinKey, MaxKey]' ] | |
}, | |
keysExamined: 44, | |
seeks: 1, | |
dupsTested: 0, | |
dupsDropped: 0 | |
} | |
}, | |
ts: ISODate("2022-05-26T16:53:47.626Z"), | |
client: '10.128.15.193', | |
allUsers: [], | |
user: '' | |
} | |
] |
๋ง๋ฌด๋ฆฌ
MongoDB ์ ์ฉ์ ์ฌ์ค ์๋นํ ๊ฐ์ฑ๋น์๊ฒ ์ ์ฉํ์๋ค. ์ฃผ์ด์ง ์๊ฐ์ด ๊ทธ๋ฆฌ ๋ง์๋ ๊ฒ์ ์๋๊ธฐ๋๋ฌธ์, ์ฐ์ Real MongoDB ์ฑ ์ ๋น ๋ฅด๊ฒ ํ์๋ค.[4] ์ฑ ์ค์์๋ ๋น ๋ฅธ ๋์ + ์ฑ๋ฅ์ ์ํด์ ๋ ํ๋ฆฌ์นด ์ , ์ธ๋ฑ์ค, ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง, ์ฟผ๋ฆฌ ์ต์ ํ ๋ถ๋ถ๋ง ํ์ค์ ์ฝ๊ณ ๋๋จธ์ง๋ ๋๊ธฐ๊ฑฐ๋ ๋น ๋ฅด๊ฒ ํ์๋ค. ์ดํ์๋ โdon't use mongodbโ โmongoDB ์ฅ์ โ ํค์๋๋ก ๊ฒ์ํ๋ฉด์ ์ต๋ํ ์ฅ์ ๋ฅผ ๋ฏธ๋ฆฌ ์๋ฐฉํ๋ ค๊ณ ํ์๋ค.
๋์ ํ์ง 6๊ฐ์์ ๋๊ฐ ๋์๋๋ฐ ์์ง๊น์ง ํฌ๊ฒ ๋ฌธ์ ์์ด ์ฌ์ฉํ๊ณ ์๋ค. MySQL์ ์๋ฒฝํ๊ฒ ๋์ฒดํ ์ ์๋ค! ๋ผ๋ ์๊ฒฌ์๋ ์์ง๊น์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง, MongoDB๋ง์ ์ฅ์ ์ด์๊ณ , ๋ง์ฝ ์ ํฉ์ฑ์ด ์ค์ํ์ง ์์ ๊ธฐ๋ฅ์ด๋ผ๋ฉด ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํด๋ ์ข์ DB๋ผ๊ณ ์๊ฐํ๋ค. ๋์ด์ผ๋ณด๋ฉด ์ด๋ ์ฒ์์ผ๋ก RDBMS์ด ์๋, NoSQL์ธ MongoDB๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ค๋ ๊ณ ์ฌ๋ฐ์ดํ์๋๊ฒ ๊ฐ๋ค.
[1] https://www.mongodb.com/docs/manual/reference/method/db.setLogLevel
[3] https://engineering.linecorp.com/ko/blog/LINE-integrated-notification-center-from-redis-to-mongodb
[4] ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ Real MongoDB : ์ด์ฑ์ฑ, 2018, ์ํค๋ถ์ค
'๋๋ฒ๊น ์ค ๐ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2๋ ์ฐจ ๊ฐ๋ฐ์์ 2022๋ ํ๊ณ (1) | 2023.01.02 |
---|---|
ํ๋ก์ ๊ธฐ๋ฐ ํผ๋ ์ํคํ ์ฒ ์ค๊ณํ๊ธฐ (0) | 2022.10.30 |
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ทธ๋์ ์ ์ธ๊น? (0) | 2022.10.25 |
[์ฑ ๋ฆฌ๋ทฐ] ์ค๋๋ถํฐ IT๋ฅผ ์์ํฉ๋๋ค (0) | 2022.08.21 |
0.2๋ ์ฐจ ๋ฐ๋๋ฐ๋ํ ์ ์ ๊ฐ๋ฐ์์ 2021 ํ๊ณ (2) | 2021.12.27 |