๐Ÿ—„๏ธDB ์ธ๋ฑ์Šค์™€ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค

Big0ยท2023๋…„ 7์›” 8์ผ
0

1. ์ธ๋ฑ์Šค(Index)๋ž€?

์ธ๋ฑ์Šค๋ž€ ์ถ”๊ฐ€์ ์ธ ์“ฐ๊ธฐ ์ž‘์—…๊ณผ ์ €์žฅ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฑ…์—์„œ Stream์ด ๊ถ๊ธˆํ•˜์—ฌ ์ฐพ์•„๋ณธ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ฑ…์˜ ๋งจ ๋’ทํŽธ์— ์ƒ‰์ธ์œผ๋กœ ์ชฝ ๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ๋ณ„๋„๋กœ ๋ฐฐ์—ดํ•ด๋†“์€ ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

image

DB์—์„œ๋„ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ์œ„์น˜๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค.

์‹ค์ œ DB ๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„ ์†๋„ ์ €ํ•˜์˜ ์›์ธ์€ ์กฐํšŒ(Select)์˜ Where๋ฌธ์—์„œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์œผ๋กœ Index๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

image
์ด ๋ถ€๋ถ„์€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ์กฐ์‹ฌ์Šค๋ ˆ ์ถ”์ธกํ•ด๋ณด์ž๋ฉด, C์–ธ์–ด๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด์„œ โ€˜ํฌ์ธํ„ฐโ€™๋ผ๋Š” ๊ฐœ๋… ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง„๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์œ„์น˜๋ฅผ ํ• ๋‹นํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„ ์ธก๋ฉด์—์„œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ๋งค์šฐ ๋น ๋ฅด๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋…์œผ๋กœ DB ์ธ๋ฑ์Šค๋ฅผ ์ดํ•ดํ•˜๋‹ˆ ์ข€ ๋” ์ˆ˜์›”ํ•˜์˜€๋‹ค.

์ธ๋ฑ์Šค ์‚ฌ์šฉ

//mysql
CREATE INDEX USER_COMPANY_INDEX ON USER(COMPANY_ID);
  • CREATE INDEX: ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ช…๋ น์–ด
  • USER_COMPANY_INDEX: ์ธ๋ฑ์Šค ์ด๋ฆ„
  • ON USER(): ํ…Œ์ด๋ธ” ์ง€์ • ๋ช…๋ น์–ด
  • COMPANY_ID: ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์ค„ ์ปฌ๋Ÿผ๋ช…
    • ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ๊ฑธ์–ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, (COMPANY_ID, EMAIL_ID,โ€ฆ, ADDRESS) ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ธ๋ฑ์Šค ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 

CRUD ๊ฐ๊ฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

์ฃผ์˜์ ์„ ์•Œ์•„๋ณด๊ธฐ ์ „์—, CRUD์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

READ โ†’ ์œ„ ๊ทธ๋ฆผ์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด๋‘๊ณ , ์ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋น›์„ ๋ฐœํ•œ๋‹ค.
UPDATE, DELETE โ†’ WHERE ์ ˆ์— ์ž˜ ์„ค์ •๋œ ์ธ๋ฑ์Šค๋กœ ์กฐ๊ฑด์„ ๋ถ™์—ฌ์ฃผ๋ฉด ์กฐํšŒํ•  ๋•Œ ์„ฑ๋Šฅ์€ ํฌ๊ฒŒ ์ €ํ•˜๋˜์ง€ ์•Š๋Š”๋‹ค. (๋‹จ, ์ด๋Š” ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๋ฅผ ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š” ๊ฒƒ์ด๊ณ , ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ์ž์ฒด์˜ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹˜!)
CREATE โ†’ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ๊ธฐ์กด์— ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ํƒ์ƒ‰ ์œ„์น˜๊ฐ€ ์ˆ˜์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ด ์ข‹์ง€ ๋ชปํ•˜๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Index๋ฅผ ํ•ญ์ƒ ์ตœ์‹ ์˜ ์ •๋ ฌ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ์›ํ•˜๋Š” ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋œ ์ปฌ๋Ÿผ์— INSERT, UPDATE, DELETE๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ ๊ทธ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • INSERT: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€
  • DELETE: ์‚ญ์ œํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ž‘์—…์„ ์ง„ํ–‰
  • UPDATE: ๊ธฐ์กด์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐฑ์‹ ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€

๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋„ค์š”?!

๋ฌด์กฐ๊ฑด ๋งŽ์ด ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋กœ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” ๋ฌธ๋‹จ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ˆ˜์ •, ์‚ฝ์ž…, ์‚ญ์ œ๋ฅผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ์ธ๋ฑ์Šค๋Š” DB ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค์˜ ๊ฐœ์ˆ˜์™€ ์ €์žฅ ๊ณต๊ฐ„์ด ๋น„๋ก€ํ•˜๋‹ค. ์ฆ‰ ์ธ๋ฑ์Šค๋ฅผ ๋งŽ์ด ์„ค์ •ํ•˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ €์žฅ ๊ณต๊ฐ„์ด ๋†’์•„์ ธ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๋Š” ๊ฑฐ์ฃ ?

์นด๋””๋„๋ฆฌํ‹ฐ(Cardinality)๊ฐ€ ๋†’๊ณ  ํ™œ์šฉ๋„๊ฐ€ ๋†’์„ ์ˆ˜๋ก ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ข‹์€ ์ปฌ๋Ÿผ์ด๋‹ค!
๋˜ํ•œ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ…Œ์ด๋ธ”์ด๋‚˜ INSERT, UPDATE, DELETE๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค.

  • DB์—์„œ ์นด๋””๋„๋ฆฌํ‹ฐ๋ž€ ์ปฌ๋Ÿผ์˜ ๊ณ ์œ ํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜์น˜๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œ์ปคํ”ผโ€๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , โ€œ๋ฉ”๋‰ด๋ช…โ€์ด๋ผ๋Š” ์ปฌ๋Ÿผ์ด ์žˆ์„ ๋•Œ,
  1. ์•„๋ฉ”๋ฆฌ์นด๋…ธ
  2. ์นดํŽ˜๋ผ๋–ผ
  3. ์ฝœ๋“œ๋ธŒ๋ฃจ
  4. ์•„๋ฉ”๋ฆฌ์นด๋…ธ
  5. ์•„์ธ์ŠˆํŽ˜๋„ˆ
    ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋Š” 4๋‹ค. ๊ณ ์œ ํ•œ ์ปฌ๋Ÿผ์ด ์ด 4๊ฐœ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก(์•„๋ฉ”๋ฆฌ์นด๋…ธ๊ฐ€ 5์ž” ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ) ์ธ๋ฑ์Šค๊ฐ€ ์ค‘๋ณต๋œ ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ํ™œ์šฉ๋„๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ์‹ค์ œ ์ž‘์—…์—์„œ ์–ผ๋งˆ๋‚˜ ํ™œ์šฉ์ด ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ’์ด๋‹ค. ํŠนํžˆ WHERE ์ ˆ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด ํ™œ์šฉ๋„๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌ

์ „์ฒด์ ์œผ๋กœ ์œ„ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์กฐํšŒํ•˜๋Š” ์†๋„์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์˜ค์šฉ(CREATE, DELETE, UPDATE๊ฐ€ ๋นˆ๋ฒˆํ•œ ์†์„ฑ์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์—ˆ์„ )ํ•˜๊ฒŒ ๋˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ์—ญํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค

์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด WHERE ์ ˆ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์ฟผ๋ฆฌ ์ „์ฒด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค(Covering Index)๋ผ ํ•œ๋‹ค.

๊ด€๋ จ ์ง€์‹

์‹คํ–‰ ๊ณ„ํš (EXPLAIN)

์ฟผ๋ฆฌ์˜ ๋งจ ์•ž์— EXPLAIN์„ ๋ถ™ํ˜€ ์‹คํ–‰ํ•˜๋ฉด, ์ƒ์„ธํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

EXPLAIN
SELECT *
FROM board.member m
WHERE m.member_id < 10;

image

  1. id : SQL๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ
  2. select_type : SELECT ๋ฌธ์˜ ์œ ํ˜•
  3. key : ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‹ค์ œ๋กœ ์„ ํƒํ•œ ์ธ๋ฑ์Šค
  4. rows : SQL๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•œ ๋ฐ์ดํ„ฐ ํ–‰ ์ˆ˜

extra

  • Using where: WHERE๋กœ ํ•„ํ„ฐ๋ง ํ•œ ๊ฒฝ์šฐ
  • Using index: ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
  • Using filesort: ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•œ ๊ฒฝ์šฐ

Non-clustered Key์™€ Clustered Key

๋Œ€์ƒ์ œํ•œ
Non-clustered Key์ผ๋ฐ˜์ ์ธ ์ธ๋ฑ์Šคํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ ๊ฐ€๋Šฅ
Clustered Key(1)PK (2) PK๊ฐ€ ์—†์„ ๋•, Unique Key(3) ๋‘˜ ๋‹ค ์—†๋‹ค๋ฉด, 6bytes์˜ Hidden Key ์ƒ์„ฑํ…Œ์ด๋ธ”๋‹น 1๊ฐœ๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ

ํƒ์ƒ‰ ์ ˆ์ฐจ

Non-clustered Key๋Š” age์— Clustered Key๋Š” PK์— ๊ฑธ๋ ค์žˆ๋Š” ์ƒํ™ฉ

image

MYSQL์—์„œ๋Š” Non Clustered Key์— Clustered Key๊ฐ€ ํ•ญ์ƒ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด์œ ๋Š” Non Clustered Key์—๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์˜ ์œ„์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ

๋”ฐ๋ผ์„œ, ์ธ๋ฑ์Šค ์กฐ๊ฑด์ด where ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ์žˆ๋”๋ผ๋„ Clustered Key ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

๋งŒ์•ฝ PK๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—” ์ธ๋ฑ์Šค ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค์˜ ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ ๊ฐ’๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์ ์šฉ

ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ปฌ๋Ÿผ์„ ๊ฐ€์ง€๋Š” ์•ฝ 20๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

  • Member ํ…Œ์ด๋ธ”์— ์žˆ๋Š” email ์ปฌ๋Ÿผ์„ ์ธ๋ฑ์Šค๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
CREATE INDEX 'idx_member_idx' ON 'test_member' (email);

SELECT + WHERE

๋จผ์ € ์•„๋ž˜์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์‚ดํŽด๋ณธ๋‹ค.

EXPLAIN
SELECT *
FROM test_member
WHERE email = 'test20@gmail.com';

image

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—” *๋ฅผ email๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

EXPLAIN
SELECT email
FROM test_member
WHERE email = 'test20@gmail.com';

image

extra ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, using index๋กœ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ํ™•์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

WHERE + GROUP BY

GROUP BY ๋Š” ์•„๋ž˜์˜ ์กฐ๊ฑด์—์„œ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋œ๋‹ค.

--- ์ธ๋ฑ์Šค๊ฐ€ (a, b, c)์ธ ๊ฒฝ์šฐ

GROUP BY b              --- ์ธ๋ฑ์Šค ์ ์šฉ X
GROUP BY b, a           --- ์ธ๋ฑ์Šค ์ ์šฉ X
GROUP BY a, c, b        --- ์ธ๋ฑ์Šค ์ ์šฉ X

GROUP BY a              --- ์ธ๋ฑ์Šค ์ ์šฉ O
GROUP BY a, b           --- ์ธ๋ฑ์Šค ์ ์šฉ O
GROUP BY a, b, c        --- ์ธ๋ฑ์Šค ์ ์šฉ O

GROUP BY b, c           --- ์ธ๋ฑ์Šค ์ ์šฉ X

GROUP BY a, b, c, d     --- ์ธ๋ฑ์Šค ์ ์šฉ X

ํ•™์Šต์„ ์œ„ํ•ด (email, PK, age)๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

CREATE INDEX `idx_member_email_id_age` ON `test_member` (email, member_id, age);

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš๊ณผ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT *
FROM test_member
WHERE email LIKE 'test20%'
GROUP BY member_id, age;

image

extra ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, using where์ด ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ํ™•์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์•ฝ 0.01sec์ด ๋‚˜์™”๋‹ค.

์ด๋ฒˆ์—” ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

SELECT email, member_id, age
FROM test_member
WHERE email LIKE 'test20%'

GROUP BY member_id, age;

image

extra ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, using index์ด ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ํ™•์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์•ฝ 0.0025sec์ด ๋‚˜์™”๋‹ค.
์•ฝ 4๋ฐฐ ๋‹จ์ถ•๋˜์—ˆ๋‹ค.

๊ฒฐ๋ก 

์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์ธ๋ฑ์Šค ์ ์šฉ ์กฐ๊ฑด์„ ์ž˜ ์ˆ™์ง€ํ•˜์—ฌ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ์กฐ

https://mangkyu.tistory.com/96
https://tecoble.techcourse.co.kr/post/2021-10-12-covering-index/
https://jojoldu.tistory.com/476
https://jojoldu.tistory.com/481

0๊ฐœ์˜ ๋Œ“๊ธ€