[์ฑ…] MySQL ํผํฌ๋จผ์Šค ์ตœ์ ํ™”

March 9, 2023์— ์ž‘์„ฑ

MySQL์˜ ๊ตฌ์„ฑ ์š”์†Œ

MySQL์€ ์ฟผ๋ฆฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„ ์—”์ง„๊ณผ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์„œ๋ฒ„์—”์ง„

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ SQL์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • DB๊ฐ€ SQL์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” โ€˜์ฟผ๋ฆฌ ํŒŒ์‹ฑโ€™, ์Šคํ† ๋ฆฌ์ง€์—”์ง„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  • ์ฟผ๋ฆฌ ์บ์‹œ, ์˜ตํ‹ฐ๋งˆ์ด์ง•์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • Table Join, Group By, Order By ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ SQL ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ Function/Procedure, Trigger, Constraint ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

  • ์„œ๋ฒ„์—”์ง„์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌผ๋ฆฌ ์žฅ์น˜์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์ด๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์กด์žฌํ•˜๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹์œผ๋กœ ๊ต์ฒดํ•ด๊ฐ€๋ฉฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
    • InnoDB, MyISAM, CSV, MEMORY, ARCHIVE, FEDERATED, MRG_MYISAM, BLACKHOLE

์ฃผ์š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ํŠน์ง•

MyISAMInnoDBArchive
์Šคํ† ๋ฆฌ์ง€ ์ œํ•œ256TB64TBNone
ํŠธ๋žœ์žญ์…˜NoYesNo
Locking ๋ ˆ๋ฒจTableRowRow
์ธ๋ฑ์ŠคB-TreeB-TreeNo
CacheIndexData/IndexNo
ํŒŒํ‹ฐ์…”๋‹YesYesYes
Cluster IndexNoYesNo
Foriegn KeyNoYesNo

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

MyISAM

๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด๋ฉฐ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด๋‹ค.

์ธ๋ฑ์Šค๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋””์Šคํฌ๋กœ ์ ‘๊ทผํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

ํŠธ๋žœ์žญ์…˜์ด ์ง€์›๋˜์ง€ ์•Š๊ณ , ํ…Œ์ด๋ธ”๋‹จ์œ„ ์ž ๊ธˆ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ํŠธ๋žœ์žญ์…˜์ด ์ง€์›๋˜์ง€ ์•Š์•„ ๋ณดํ†ต InnoDB๋ฅผ ๋งŽ์ด ์“ด๋‹ค.

Full-text indexing, geo spatial indexing์„ ์ œ๊ณตํ•œ๋‹ค.

InnoDB

MySQL์—์„œ ์œ ์ผํ•˜๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด๋‹ค. MVCC(๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด ๋งค์ปค๋‹ˆ์ฆ˜; ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„œ๋กœ์˜ READ/WRITE๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ธ๋ฑ์Šค์™€ ๋ฐ์ดํ„ฐ ๋‘˜ ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— InnoDB_Buffer_Pool_SIze๊ฐ€ DB ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

Primary Key๋Š” Clustering Index(์ธ๋ฑ์Šค ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๊ตฌ์กฐ)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

Archive

๋กœ๊ทธ ์ˆ˜์ง‘์— ์ ํ•ฉํ•˜๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ์••์ถ•๋˜๊ณ , ์••์ถ•๋œ ์ƒํƒœ๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋œ๋‹ค.

ํ•œ๋ฒˆ INSERT๋˜๋ฉด UPDATE์™€ DELETE๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์ธ๋ฑ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

MySQL์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

MySQL์—์„œ๋Š” ๋ชจ๋“  SQL์„ ๋‹จ์ผ ์ฝ”์–ด์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  MySQL์€ ํ…Œ์ด๋ธ” ์กฐ์ธ์„ Nested Loop Join ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Nested Loop Join ์•Œ๊ณ ๋ฆฌ์ฆ˜

์กฐ๊ฑด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ’ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํ…Œ์ด๋ธ”B์™€ ๋น„๊ตํ•˜์—ฌ ์กฐ์ธํ•œ๋‹ค. ex. for๋ฌธ ์•ˆ์˜ for๋ฌธ ํ˜•์‹์ด๋‹ค.

DB ๋‚ด๋ถ€์—์„œ๋Š” Block Nested Loop Join๋ฐฉ์‹(์กฐ์ธ ๋ฒ„ํผ ๊ฐœ๋…)์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ํ…Œ์ด๋ธ” ์กฐ์ธ ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(๋ฒ„ํผ)์— ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•ด๋‘๊ณ  ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค.

for each row in t1 matching range {
	for each row in t2 matching reference key {
		for each row in t3 {
			if row satisfies join conditions,
			send to client
		}
	}
}

SQL์—์„œ WHERE ์กฐ๊ฑด์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์“ฐ์ž

๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜ ํ•จ์ •์— ๋น ์ง€์ง€ ๋ง ๊ฒƒ

์กฐ๊ฑด์ ˆ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅผ ๋•Œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํƒ€์ž…์œผ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ •์ˆ˜ ํƒ€์ž…์ด ๋ฌธ์ž์—ด๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด๊ณผ ์ •์ˆ˜๊ฐ’ ๋น„๊ต ์‹œ ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ์ž๋™์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋งŒ์•ฝ ์ธ๋ฑ์Šค ํ•„๋“œ์—์„œ ์ด ํ˜•๋ณ€ํ™˜์ด ์ผ์–ด๋‚œ๋‹ค๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌต์‹œ์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์„ ํ•ด์•ผ ํ•œ๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋ฌธ์ž์—ด ์ธ๋ฑ์Šค๋ฐ–์— ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.

ํ•จ์ˆ˜ ์‚ฌ์šฉ

๋‚ด์žฅ ํ•จ์ˆ˜, ๋˜๋Š” ์‚ฌ์šฉ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์— ๋” ์•ˆ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.

LIKE ๊ฒ€์ƒ‰

๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์ธ ๊ฒฝ์šฐ์—” ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

LIKE ๊ฒ€์ƒ‰ ์‹œ โ€˜%โ€™ ์œ„์น˜์— ๋”ฐ๋ผ์„œ๋Š” ์นผ๋Ÿผ์— ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„์ง€๋ผ๋„ ์ค‘๊ฐ„ ๋˜๋Š” ๋’ท๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์˜๋ฏธ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ ๋Œ€๋ถ€๋ถ„์˜ DBMS์—๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์žˆ๋Š”๋ฐ, ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋„๋ฅผ ๋”ฐ์ ธ์„œ ๋‚ด๋ถ€์ ์œผ๋กœ SQL์„ ์ตœ์ ํ™” ํ•œ๋‹ค. ๋งŒ์•ฝ ์กฐํšŒํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ์ค€์น˜ ์ด์ƒ์ด๋ผ๋ฉด, ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ๋จผ์ € ์ฝ๊ณ  ๋‹ค์‹œ ํŒŒ์ผ๋กœ ๊ฐ€๋Š” ๊ฒƒ ๋ณด๋‹ค ํŒŒ์ผ์„ ๋ฐ”๋กœ ์ฝ๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๊ณ  ํŒ๋‹จํ•ด DB Full Scan์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

TODO

  • LIKE ์กฐ๊ฑด์ด โ€˜๊ฒ€์ƒ‰์–ด%โ€™์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์•ž ๋‹จ์— ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋„๋ฅผ ๋”ฐ์ ธ์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • LIKE ์กฐ๊ฑด์ด โ€˜%๊ฒ€์ƒ‰์–ดโ€™์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด LIKE ์กฐ๊ฑด ์ด์™ธ์˜ ์กฐ๊ฑด์ ˆ์„ ์ ๊ทน ํ™œ์šฉํ•ด์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ธ๋‹ค.

Transaction Isolation Level์— ์œ ์˜ํ•˜์ž

MySQL์—์„œ ํŠธ๋žœ์žญ์…˜ Isolation ๋ ˆ๋ฒจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ โ€˜REPEATABLE-READโ€™์ด๋‹ค.

์ด ์ƒํƒœ์—์„œ โ€˜INSERTโ€™๋‚˜ โ€˜CREATEโ€™๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์— โ€˜ํ…Œ์ด๋ธ” ๋‹จ์œ„ ์ž ๊ธˆโ€™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์˜ ์ข…๋ฅ˜

  • READ UNCOMMITTED ์ปค๋ฐ‹ ์ „ ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • READ COMMITED ์ปค๋ฐ‹๋œ ์ƒํƒœ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.
  • REPEATABLE READ InnoDB์˜ ๊ธฐ๋ณธ ์„ค์ •. SELECT ์‹œ ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ค์–ด์„œ ์Šค๋ƒ…์ƒท์„ ์กฐํšŒ. ๋™์ผ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•จ. ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • SERIALIZABLE ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ SELECT ๋ฌธ์žฅ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— Shared Lock(์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ)์ด ๊ฑธ๋ฆผ.

์ธ๋ฑ์Šค๋Š” ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•˜์ž

์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ฆฐ ํ…Œ์ด๋ธ”์— ์•„์ดํ…œ์„ ์‚ฝ์ž…ํ•œ๋‹ค๋ฉด

InnoDB์—์„œ๋Š” Primary Key ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— InnoDB์—์„œ Primary Key๋Š” ์„ฑ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค€๋‹ค. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์ด ์ผ์–ด๋‚˜๋ฉด ์ „์ฒด ํ–‰์˜ ์ˆœ์„œ๋“ค์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ์ด๋™๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค (๋”ฐ๋ผ์„œ ์ˆœ์ฐจ ์‚ฝ์ž…์ด ๋žœ๋ค ์‚ฝ์ž…๋ณด๋‹ค๋Š” ๋‚˜์Œ)

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ Primary Key๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, InnoDB์—์„œ๋Š” Primary Key๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ Primary Key๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ธ๋ฑ์Šค ์ค‘ Unique ์†์„ฑ์ด ์žˆ๋Š” Key๋ฅผ Primary Key๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • Primary Key๋„ ์—†๊ณ  Unique Key๋„ ์—†์œผ๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ 6Byte์˜ ๋Œ€์ฒด Primary Key๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด?

CREATE TABLE `test_0_index` (
	`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
	`j` int(10) unsigned NOT NULL,
	`s` varchar(64) NOT NULL,
	`d` datetime NOT NULL,
	PRIMARY KEY (`i`),
	INDEX idx_j(j),
	INDEX idx_d(d),
	INDEX cidx_jd(j,d),
	INDEX cidx_dj(d,j)
);

์œ„์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์—์„  cidx_jd์™€ cidx_dj ์ธ๋ฑ์Šค์—์„œ ๊ฐ ์ปฌ๋Ÿผ์„ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— j ๋˜๋Š” d๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ ์š”์ฒญ์ด ์™€๋„ ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถ”์ถœํ•˜๋ฏ€๋กœ j์™€ d ์ปฌ๋Ÿผ์˜ ์ธ๋ฑ์Šค๋Š” ๋ถˆํ•„์š”ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ d๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ i ์ปฌ๋Ÿผ ์ˆœ์„œ๋กœ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด cidx_dj๊ฐ€ ์˜คํžˆ๋ ค ํ•„์š”์—†๋Š” ์ธ๋ฑ์Šค์ด๋‹ค โ†’ idx_d๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋Š” primary key ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค์ง€๋งŒ, cidx_dj ์ธ๋ฑ์Šค์—์„œ d๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋Š” j์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ธ๋ฑ์Šค ์‚ฌ์ด์ฆˆ ์ค„์ด๊ธฐ

์ธ๋ฑ์Šค๊ฐ€ ์ปค์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ๋–จ์–ด์ง€๊ณ  Disk I/O๊ฐ€ ๋งŽ์•„์ง„๋‹ค.

varchar ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ๋ผ๋ฉด crc32 ๊ฐ™์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํฌ๊ธฐ๋ฅผ ์ค„์ด์ž.

ํ…Œ์ด๋ธ” ํŒŒํ‹ฐ์…”๋‹

ํŒŒํ‹ฐ์…”๋‹; ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ถ„ํ•  ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ์„ ํƒ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์ œํ•œ ์‚ฌํ•ญ

  1. ํŒŒํ‹ฐ์…”๋‹ ํ‚ค๋Š” Primary Key์™€ ์—ฐ๊ด€๋œ ์ปฌ๋Ÿผ์ด์–ด์•ผ ํ•œ๋‹ค.
  2. ํŒŒํ‹ฐ์…”๋‹ ์‚ฌ์šฉ ์‹œ Unique Key ํ˜น์€ Foriegn Key์™€ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.
  3. ํŒŒํ‹ฐ์…”๋‹ ์ ์šฉ ์‹œ ํ’€ํ…์ŠคํŠธ ์ธ๋ฑ์‹ฑ(full text search์—์„œ ์‚ฌ์šฉ. ๋ฏธ๋ฆฌ ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅ.) ํ˜น์€ Spatial ์ธ๋ฑ์‹ฑ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  4. ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ๋ฐ˜๋“œ์‹œ ํŒŒํ‹ฐ์…”๋‹ ํ‚ค๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์Šค์บ”ํ•œ๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ 

InnoDB ๋Œ€์‹  ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉ

InnoDB๋Š” ํ–‰ ๋‹จ์œ„ ์ž ๊ธˆ์œผ๋กœ ์ฒ˜๋ฆฌ(๋™์‹œ์„ฑ ์ข‹์Œ) + ์ธ๋ฑ์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฒ„ํผํ’€(๋ฉ”๋ชจ๋ฆฌ)์— ์ €์žฅํ•˜๋ฏ€๋กœ ๋””์Šคํฌ I/O๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ์ธ๋ฑ์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์ง€ ์•Š๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Primary Key๋ฅผ ์ œ์™ธํ•œ ๋ณด์กฐ ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ Primary Key๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ƒ๋‹นํžˆ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹จ์ˆœ ๋กœ๊ทธ ์ˆ˜์ง‘์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ผ๋ฉด ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. โ†’ Archive or MyISAM.

์„œ๋น„์Šค ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์„ ์ •

๋กœ๊ทธ์ „์šฉ, ์—…๋ฐ์ดํŠธ X โ†’ Archive

์ฝ๊ธฐ ์ „์šฉ or ๋กœ๊ทธ+์—…๋ฐ์ดํŠธ โ†’ MyISAM

๋™์‹œ ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ โ†’ InnoDB

InnoDB ์‚ฌ์šฉ ์‹œ Barracuda ํŒŒ์ผ ํฌ๋งท ๊ณ ๋ คํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ Compact, Dynamic, Compressed ์ด ์„ธ ๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Compact

ํ…์ŠคํŠธ ์นผ๋Ÿผ(BLOB, VARCHAR, TEXT)์˜ ๊ฒฝ์šฐ ์ฒ˜์Œ 768๋ฐ”์ดํŠธ๋งŒ ๋ฐ์ดํ„ฐ ํŠธ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณ„๋„์˜ ํŽ˜์ด์ง€์— ์ €์žฅ. ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ 20๋ฐ”์ดํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

Dynamic

์ „์ฒด ์นผ๋Ÿผ์„ ๋ฐ์ดํ„ฐ ํŠธ๋ฆฌ์— ๋„ฃ๋„๋ก ์‹œ๋„. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณ„๋„์˜ ํŽ˜์ด์ง€์— ์ €์žฅํ•œ๋‹ค.

Compressed

Dynamic์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ •ํ•ด์ง„ ๋ธ”๋ก ์‚ฌ์ด์ฆˆ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•œ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์••์ถ•ํ•ด์„œ ์ €์žฅํ•œ๋‹ค. zlib ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์™€ ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ์••์ถ•ํ•ด์„œ ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ทน๋ณตํ•˜๊ฒŒ ํ•ด์ค€๋‹ค