โ ๊ฐ๋ฐ์๋ค์ด ๋ฌธ์ ์ ์ ์ด์ผ๊ธฐํ๋ฉด ๊ณ ๊ฐ์ ์ง์ฑ ์ ํ๋ค. ๊ณ ๊ฐ์ด ์ค์ํ ์ฌํญ์ ์ด์ผ๊ธฐํ๋ฉด ๊ฐ๋ฐ์๋ ๋ฌด์ํ๋ค. โ
- Kent Beck

๋ชฝ๊ณ ๋๋น ์ธ๋ฑ์ค
DB์์ ์ธ๋ฑ์ค๋ ์ ๋ง ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์์ฃผ ์กฐํ๋๋ ํ๋๋ฅผ ๋ฐ๋ก ์ ์ฅํด์ ์กฐํ ๋ฐ ์ ๋ ฌ ์์ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
/* book ์ปฌ๋ ์
์ someField ํ๋์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
๋ช
๋ น ์คํ ํ ์ธ๋ฑ์ค ์์ฑ์ด ์๋ฃ๋ ๋๊น์ง ํด๋น ์ปฌ๋ ์
์ ๋ํ ๋ชจ๋ CRUD๋ ๋ธ๋กํน ๋๋ค. */
db.book.createIndex({name:1}) // nameํ๋์ ์ธ๋ฑ์ค ์ค์
// single field index : ๋จ์ผ key ์ธ๋ฑ์ค, 1์ ์ค๋ฆ์ฐจ์, -1์ ๋ด๋ฆผ์ฐจ์
/* book ํ๋์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
๋ช
๋ น ์คํ ํ ์ธ๋ฑ์ค ์์ฑ์ด ์งํ ์ค์ด๋๋ผ๋ ํด๋น ์ปฌ๋ ์
์ ๋ํ ๋ชจ๋ CRUD๊ฐ ๊ฐ๋ฅํ๋ค. */
db.someCollection.createIndex({name:1}, {background:1}) // ๋ฐฑ๊ทธ๋ผ์ด๋ ์ต์
์ธ๋ฑ์ค๋ ์ผ๋ฐ ํ๋ ๋ฟ๋ง ์๋๋ผ, ๊ฐ์ฒด ๊ฐ์ ๊ฐ์ง๋ ํ๋์ ๋ด๋ถ ์์ฑ์๋ ์ง์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด { name: { first: 'Zero', last: 'Cho' } } ๊ฐ ์์ ๊ฒฝ์ฐ,
createIndex({ 'name.last': 1 }); ์ด๋ ๊ฒ ์ธ๋ฑ์ค ์ง์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฐธ๊ณ ๋ก _id ํ๋๋ ์๋์ผ๋ก ์ธ๋ฑ์ค ์ค์ ์ด ๋์ด ์์ต๋๋ค.
์ฌ๋งํ ๊ฒฝ์ฐ๋ฉด _id๋ฅผ ์ฌ์ฉํด์ ์กฐํํ๋ ๊ฒ ์ข์ต๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค
๋ํ ์ธ๋ฑ์ค๋ ํ๋์ ํ๋์๋ง ์ง์ ํ ํ์๋ ์์ต๋๋ค.
์ฌ๋ฌ ๊ฐ์ ํ๋๋ฅผ ๋ฌถ์ด์ ์ง์ ํ ์๋ ์์ต๋๋ค.
// compound(๋ณตํฉ) field index : ๋ณตํฉ์ ์ผ๋ก key index
db.book.createIndex({name:1, hits:1})
์ด ๊ฒฝ์ฐ๋ findํ ๋ ์ฌ๋ฌ ํ๋๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ๋์์ค๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค๋ ์์๊ฐ ์ค์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, a, b, c ํ๋ ์์๋ก ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ, ์๋์ผ๋ก a์ a, b ํ๋์ ๋ํ ์ธ๋ฑ์ค๋ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
์์ ๊ฒฝ์ฐ, name ํ๋๋ง ์กฐํํ๊ฑฐ๋ name, hits ํ๋ ๋๊ฐ๋ฅผ ์กฐํํ ๋๋ ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ง๋ง hits ํ๋๋ง ์กฐํํ๊ฑฐ๋ ๊ทธ์ธ์ ํ๋๋ฅผ ์กฐํํ ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ ์คํธ ์ธ๋ฑ์ค
์ธ๋ฑ์ค๋ฅผ ์ง์ ํ ๋ text๋ผ๊ณ ๋ฃ์ด์ค๋๋ค.
์ด ๊ฒฝ์ฐ $text ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
db.book.createIndex({name:"text"})
{ $text: { $search: ๋ฌธ์, $language: ์ธ์ด, $caseSensitive: ๋์๋ฌธ์๊ตฌ๋ณ } }
๋ฌธ์์ด ํ๋์ ์ธ๋ฑ์ค ์ค๊ณ ์ ๋ต
- String ํ์
์ ํ๋ ๊ฐ์ ๋ํด ์กฐ๊ฑด ์กฐํ๋ฅผ ํ ๊ฒฝ์ฐ,
MongoDB๋ $regex ์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท์์ผ๋ก ํด๋น ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๋ํ๋จผํธ๋ฅผ ์กฐํํฉ๋๋ค.
์ต์ ์ ์กฐํ ์ฑ๋ฅ์ ์ํด ์๋ ์ฌํญ์ ์์งํด์ผ ํฉ๋๋ค.
1. String ํ์
ํ๋์ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์์ง ์์ผ๋ฉด ๋์ ์ปฌ๋ ์
์ ํ์ค์บ์ด ๋ฐ์ํ๋ค.
2. ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์์ ๊ฒฝ์ฐ, ์ผ์น ์กฐ๊ฑด(eq = /keyword/)์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
3. ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์์ ๊ฒฝ์ฐ, ์ ๋์ด ์กฐ๊ฑด(startsWith = /^keyword/) ๋ํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
4. ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋๋ผ๋, ์ ๋ฏธ์ด ์กฐ๊ฑด(startsWith = /keyword$/)์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
5. ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋๋ผ๋, ํฌํจ ์กฐ๊ฑด(contains = /.*keyword.*/)์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ์ ๋ฏธ์ด ์กฐ๊ฑด(endsWith = /keyword$/)์ ์์ ์ ๋ฆฌํ๋ฏ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ ์ปฌ๋ ์ ์ ํ์ค์บ์ด ๋ฐ์ํฉ๋๋ค. ์ ๋ฏธ์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ํด๋น ํ๋์ ๋ฌธ์ ์์๋ฅผ ๊ฑฐ๊พธ๋ก ๋ค์ง์ ํ๋๋ฅผ ์์ฑํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
- ํํ
์คํธ ๊ฒ์(FTS)์ ์ํ๋ค๋ฉด text ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
์ ์ํ ์ ์ ํ์ฌ ๊ณต์์ ์ผ๋ก ์์ด๊ถ์ ๋ฌธ์์ด๋ง FTS๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ CJK ๊ณ์ด์ ํ๊ธ ๋ฌธ์์ด์ ๊ฒฝ์ฐ ํํ์ ๋ถ์์ด ๋์ง ์์ ์๋ํ๋๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
๋์์ผ๋ก์์ ๋ฐฉ๋ฒ์, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒด์ ์ธ ํ๊ธ ํํ์ ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํ๋ ๊ฐ์ ๋ช ์ฌ ๋จ์๋ก ์ชผ๊ฐ ํ ์ค๋ณต์ ์ ๊ฑฐํ ๋ฐฐ์ด ํ๋๋ฅผ ์์ฑํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค. (์คํ ์์ค ํ๊ธ ํํ์ ๋ถ์๊ธฐ์ธ KOMORAN์ ์ฌ์ฉ. [๊ด๋ จ ๋งํฌ])
๊ทธ์ธ ์ธ๋ฑ์ค ์ข ๋ฅ
- multikey index(๋ฐฐ์ด์ผ ๊ฒฝ์ฐ ์ฌ์ฉ)
- geospatial index(์ง๋)
- text index(text ๊ฒ์)
- hash index(hash ์ธ๋ฑ์ค ์๋๋ ์ข์ผ๋, ์ ๋ ฌ์ด ์๋จ)
๋ชฝ๊ณ ๋๋น ์ธ๋ฑ์ค ๋ฌธ๋ฒ
์ธ๋ฑ์ค ์์ฑ
db.book.createIndex({name:1}) // nameํค์ ์ธ๋ฑ์ค ์ค์
db.book.createIndex({name:"text"}) // nameํค์ ๋ฑ์คํธ ์ธ๋ฑ์ค ์์ฑ
์ธ๋ฑ์ค ์กฐํ
์ธ๋ฑ์ค๋ ์ฒ์ db๋ฅผ ๋ง๋ค ๋ ์๋์ผ๋ก ์์ฑ๋๋ system.indexes ์ปฌ๋ ์ ์ ์ ์ฅ๋ฉ๋๋ค.
db.book.getIndexes();

์ธ๋ฑ์ค ์ ๊ฑฐ
ํน์ ์ธ๋ฑ์ค๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด
// ํน์ ์ธ๋ฑ์ค ์ ๊ฑฐ
db.book.dropIndex(ํ๋์ด๋ฆ);
// ๋ชจ๋ ์ ๊ฑฐ
db.book.dropIndexes();
์ธ๋ฑ์ค ์กฐํฉ
๋ชฝ๊ณ DB๋ ๋๋ํ๊ฒ ์ฌ๋ฌ ์ธ๋ฑ์ค๋ฅผ ์กฐํฉํฉ๋๋ค.
๋ง์ฝ nameํ๋์ hpํ๋์ ๋ํ ์ธ๋ฑ์ค๊ฐ ๋ฐ๋ก ์์ผ๋ฉด,
db.monsters.find({ name: 'Slime', hp: { $gt: 10 } })
๋ฅผ ํ ๊ฒฝ์ฐ, ๋ ์ธ๋ฑ์ค๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ฌ ์กฐํํฉ๋๋ค.
์ธ๋ฑ์ค ๋จ์
์ธ๋ฑ์ค์ ๋จ์ ์ ์ธ๋ฑ์ค ์์ฒด๊ฐ ์ฉ๋์ ์ฐจ์งํ๋ค๋ ๊ฒ๋๋ค.
db.monsters.totalIndexSize();

์์ ์ธ๋ฑ์ค ํ๋๋ฅผ ์ค์ ํ๋๋ 16kb๋ฅผ ์ก์๋จน๊ฒ ๋ฉ๋๋ค.
๋๋ฌด ๋ง์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ ์ฉ๋์ ๋ญ๋นํ์ง ์๋๋ก ํฉ์๋ค.
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.