MySQL ์ํคํ ์ฒ
MySQL ์์ง ๊ด๋ จ
๊ธฐ๋ณธ
- ํธ๋ค๋ฌ, ์์ง, ์คํ ๋ฆฌ์ง์์ง, ํ๋์จ์ด๋ก ์ด๋ฃจ์ด์ง
- ์ค๋ ๋ฉ: ํฌ์ด๊ทธ๋ผ์ด๋ ์ค๋ ๋(ํด๋ผ์ด์ธํธ ์ค๋ ๋)์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋
- MyISAM์ ํด๋ผ์ด์ธํธ์ค๋ ๋๊ฐ ์ฐ๊ธฐ ์์ ๊น์ง
- ๋ฉ๋ชจ๋ฆฌ: ๊ธ๋ก๋ฒ์์ญ๊ณผ ํด๋ผ์ด์ธํธ ๋ก์ปฌ
- ๊ธ๋ก๋ฒ : ํ ์ด๋ธ ์บ์, ๋ฒํผํ, ํด์์ธ๋ฑ์ค, ๋ฆฌ๋๋ก๊ทธ ๋ฒํผ
- ๋ก์ปฌ : ์ปค๋ฅ์ , ์ ๋ ฌ๋ฒํผ, ์กฐ์ธ ๋ฒํผ
๊ฐ ํ์ ์์ ์ด MySQL ์์ง ์์ญ์์ ์ฒ๋ฆฌ๋๋์ง, ์๋๋ฉด ์คํ ๋ฆฌ์ง ์์ง ์์ญ์์ ์ฒ๋ฆฌ๋๋์ง ๊ตฌ๋ถํ ์ค ์์์ผ ํ๋ค.
์ฟผ๋ฆฌ ์คํ ๊ตฌ์กฐ
SQL ์์ฒญ -> (MySQL ์์ง์์) ์ฟผ๋ฆฌํ์ -> ์ ์ฒ๋ฆฌ๊ธฐ -> ์ตํฐ๋ง์ด์ (์ฟผ๋ฆฌ ๋ณํ, ๋น์ฉ ์ต์ ํ, ์คํ ๊ณํ ์๋ฆฝ) -> ์ฟผ๋ฆฌ์คํ๊ธฐ (์คํ ๋ฆฌ์ง ์์ง์์ ์คํ)
- ์ฟผ๋ฆฌ ํ์
- ์ฌ์ฉ์ ์์ฒญ ์ฟผ๋ฆฌ๋ฅผ ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํด ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ง๋ฆ, ๋ฌธ๋ฒ์ฒดํฌ๋ ์ฌ๊ธฐ์
- ์ ์ฒ๋ฆฌ๊ธฐ
- ๋ฌธ์ฅ์ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ์ ํ์ , ๊ฐ์ฒด ์กด์ฌ์ฌ๋ถ๋ ์ ๊ทผ๊ถํ ์ฒดํฌ๋ ์ฌ๊ธฐ์
- ์ตํฐ๋ง์ด์
- ๊ฐ์ฅ ์ ๋ ดํ ๋น์ฉ์ ์คํ๊ณํ ๊ฒฐ์
์ด ์ฑ ์์๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ ํํ๋ ๋ด์ฉ์ ์ค๋ช ํ ๊ฒ์ด๋ฉฐ, ์ด๋ป๊ฒ ํ๋ฉด ์ตํฐ๋ง์ด์ ๊ฐ ๋ ๋์ ์ ํ์ ํ ์ ์๊ฒ ์ ๋ํ๋๊ฐ๋ฅผ ์๋ ค์ค ๊ฒ์ด๋ค.
์คํ ์์ง
๋ง๋ค์ด์ง ๊ณํ๋๋ก ๊ฐ ํธ๋ค๋ฌ์์ ๋ฐ์ ์์ฒญ์ ๋ค๋ฅธ ํธ๋ค๋ฌ ์์ฒญ์ ์ ๋ ฅ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ญํ
๊ทธ ์ธ
๊ฐ๊ฐ์ ์ธ๋ถ ์ฃผ์ ๋ก ์ก๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค. ๋ฌดํผ ์๋์ ๊ฐ์ ์ ๋ณด๋ค์ด ์์ง์์ ์ง์ํ๋ค.
- ๋ณต์
- ์ฟผ๋ฆฌ ์บ์
- ์ค๋ ๋ ํ
- ํธ๋์ญ์ ์ง์ ๋ฉํ๋ฐ์ดํฐ
InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ํคํ ์ฒ
๊ฑฐ์ ์ ์ผํ๊ฒ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ์ ์ ๊ณตํ๋ค.
ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ์ํ ํด๋ฌ์คํฐ๋ง
- ํ๋ผ์ด๋จธ๋ฆฌ ํค ๊ฐ์ ์์๋๋ก ๋์คํฌ์ ์ ์ฅ๋จ
- ๋ชจ๋ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ ๋ ์ฝ๋์ ์ฃผ์ ๋์ ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ๊ฐ์ ๋ ผ๋ฆฌ์ ์ธ ์ฃผ์๋ก ์ฌ์ฉ(MyISAM์์๋ ์ค์ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์)
์ธ๋ ํค ์ง์
- ์ค์ ์์ง๋ ๋ฒจ์์์ ์ธ๋ํค ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์ง์์ ํจ
MVCC
์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ ๋ ๋ฒจ์ ํธ๋์ญ์ ์ ์ง์ ํ๋ dbms๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ์ ๊ธ์ ์ฌ์ฉํ์ง ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ ๊ณตํ๋๋ฐ ๋ชฉ์ ์ด ์๋ฐ.
- ์ธ๋๋ก๊ทธ๋ฅผ ํตํด ์ง์
- multi version์ด๋ ํ๋์ ๋ ์ฝ๋์ ๋ํด ์ฌ๋ฌ๊ฐ์ ๋ฒ์ ์ด ๋์ ๊ด๋ฆฌ๋๋ค๋ ๊ฒ
- ๊ตฌ๋ฌธ ์คํ๊ณผ ๋์์ (์ปค๋ฐ ์ฌ๋ถ์ ๊ด๋ จ ์์ด) innodb๋ฒํผ ํ์ ๋ฐ์, ๋์คํฌ์๋ ๋ฐ์์ฌ๋ถ๊ฐ ํ์ค์น ์์
- ์ด ์์ ์์์ ์กฐํ๋ ๊ฒฉ๋ฆฌ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ํฌ๊ฒ ์ดํด๋ณด๋ฉด
READ_UNCOMMITED: ๋ฒํผ์์ ๋ฐํํ๋ค.READ_COMMITED์ด์์ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ : ์ปค๋ฐ ์ ์ด๋ฉด ์ธ๋๋ก๊ทธ์์ ๋ฐํํ๋ค.- ์ฆ innodb๋ฒํผํ-๋์คํฌ, ์ธ๋๋ก๊ทธ๊น์ง ๋ฉํฐ๋ฒ์ ์ด ์๋ ๊ฒ
์ ๊ธ ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ (Non-Locking Consitent Read)
- ๊ฐ๋จํ๊ฒ ์์ฝํ๋ฉด ์ฝ๊ธฐ์ ๋ํ ๋ฝ์ ๊ฑธ์ง ์๊ณ , ๊ฒฉ๋ฆฌ๋ ๋ฒจ์ค์ ์ ๋ฐ๋ผ์, ์ฝ๋ ์์ ์ ์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๊ฐ
์๋ ๋ฐ๋๋ฝ ๊ฐ์ง
- ์ ๊ธ ๋๊ธฐ ๋ชฉ๋ก์ ๊ทธ๋ํ ํํ๋ก ๊ด๋ฆฌ
- ๋ณ๋์ ์ค๋ ๋๊ฐ ํด๋น ๋ชฉ๋ก์ ํ ๋๋ก ๋ฐ๋๋ฝ์ ๊ฐ์ง
- ๊ต์ฐฉ์ํ์ ํธ๋์ญ์ ์ค ํ๋๋ฅผ ์ข ๋ฃ
- ํธ๋์ญ์ ์ธ๋ ๋ก๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก(๊ฒฝ์ ์ ์ธ ๊ด์ ์์) ๊ฐ์ ์ข ๋ฃํ ํธ๋์ญ์ ์ ์ ํ
- ์ฐธ๊ณ ๋ก ์์ ๋ ์ด์ด์ mysql์์ง์์ ํ
์ด๋ธ์ ๊ธ์ด ๋๊ฒฝ์ฐ ๋ฐ๋๋ฝ ํ๋จ์ด ๋ถํ์ค ํ ์ ์๋๋ฐ, ์์คํ
๋ณ์๋ก ๋ฐฉ์งํ ์์์
innodb_table_locks - ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋ ์์ฒด์ ๋ถํ๋ ๋ฆฌ์์ค๊ฐ ํฌ์ง ์์ง๋ง, ํธ๋์ญ์
์ด ๋ง์์ง๋ฉด ๋ถ๋ด์ด๋จ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ง์ด๋ ์์
์ ๊ธ ๋๊ธฐ ๋ชฉ๋ก์๋ ๋ฝ์ ๊ฑธ๊ธฐ์, ๋ค๋ฅธ ์๋น์ค ์ฟผ๋ฆฌ์ ํธ๋์ญ์ ์๋ ์ง์ฐ์ ์ ๋ฐํจ. - ๊ทธ๋์
innodb_deadlock_detect๋ฅผ ๋๊ณ ,innodb_lock_wait_timeout์ ํตํด์ ๋ฝ์๊ฐ์ ํตํด ํธ๋์ญ์ ์ ์ธ๋ํ๋ ๋ฐฉ์์ผ๋ก ์ด์ํ๊ธฐ๋ ํจ.- ์ฑ ์์ ๋์จ ๋ด์ฉ์ ์๋์ง๋ง, ์๋ง๋ ๊ต์ฐฉ์ํ์ ํธ๋์ญ์ ์ ๊ฒฝ์ ์ ์ผ๋ก ์ข ๋ฃํ๋๊ฒ์ ์๋๋ผ, ๊ฒฐ๊ณผ์ ์ธ ๋ถํ๋ ๋ ์์ข์ ์ ์์๊ฒ ๊ฐ๋ค. (์ํฉ์ ๋ฐ๋ผ์)
์๋ํ๋ ์ฅ์ ๋ณต๊ตฌ
- ์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ๊ฒฌ๊ณ ํ ์ฅ์ ๋ณต๊ตฌ ์์คํ ์ด ์์
innodb_force_recovery: ์ฅ์ ๊ฐ ๋์ ์์์ด ์๋๋๊ฒฝ์ฐ ์ฌ์ฉ- ์์ ๋ณ์ ์ค์ ์ผ๋ก ์์ํ๋ฉด, ๊ฐ๋ฅํ ๋งํผ ๋คํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์
ํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ก ํ
์ด๋ธ ๋ค์ ์์ฑํ๋๊ฒ์ด ์ข๋ค.
- 1=SRV_FORCE_IGNORE_CORRUPT : ์ธ๋ฑ์ค๋ ํ ์ด๋ธ์ ์์์ ๋ฌด์ํ๊ณ ์์
- 2=SRV_FORCE_NO_BACKUP : ๋ฉ์ธ์ค๋ ๋๋ฅผ ์์ํ์ง ์๊ณ ์๋ฒ ์์, ๋ฉ์ธ์ค๋ ๋๊ฐ ์ธ๋๋ฐ์ดํฐ ์ญ์ ํ๋๊ณผ์ ์์ ์ฅ์ ๊ฐ ๋ฐ๋ณต๋๋ค๋ฉด ์ด๊ฑฐ ์ฌ์ฉ
- 3=SRV_FORCE_NO_TRX_UNDO : ์ปค๋ฐ๋์ง ์๊ณ ์ข ๋ฃ๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑ์ ๋ง์
- 4=SRV_FORCE_NO_IBUF_MERGE : ์ธ์ํธ ๋ฒํผ์ ๋ด์ฉ ๋ฌด์ํ๊ณ ์์
- 5=SRV_FORCE_NO_UNDO_LOG_SCAN : ์ธ๋๋ก๊ทธ๋ฅผ ์ค์บํ์ง ์๊ณ , ์ฅ์ ์์ ์ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ฒ์ฒ๋ผ ๋์
- 6=SRV_FORCE_NO_LOG_REDO : ๋ง์ง๋ง ์ฒดํฌํฌ์ธํธ๋ก ์์
์ด๋๋ ์๋๋ค๋ฉด, db๋ฐฑ์ ๊ณผ ๋ฐ์ด๋๋ฆฌ๋ฅผ ํตํด์..
InnoDB ๋ฒํผ ํ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ถ๋ถ, ๋์คํฌ ๋ฐ์ดํฐํ์ผ์ด๋ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด๋๋ ๊ณต๊ฐ์ด๋ค. ์ฐ๊ธฐ์์ ์ ์ง์ฐ์์ผ ์ผ๊ด ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๋ฒํผ ์ญํ ๋ ๊ฐ์ด ํ๋ค.
๋ฒํผ ํ์ ํฌ๊ธฐ ์ค์
- os์ 80ํผ์ผํธ๋ฅผ ํ ๋นํ๋ผ๋ ๊ฐ์ด๋๋ผ์ธ์ ์๋ชป๋จ
- ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋ ์ฝ๋ ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ์์
- 128mb์ ์ฒญํฌ๋ฅผ ๋จ์๋ก ์กฐ์ ๊ฐ๋ฅ
๋ฒํผ ํ์ ๊ตฌ์กฐ
๊ฑฐ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ด์งํฌ๊ธฐ๋ก ์ชผ๊ฐ์ ๊ด๋ฆฌํ๋ค. ํฌ๊ฒ LRU ๋ฆฌ์คํธ, Flush ๋ฆฌ์คํธ, Free ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ค.
LRU ๋ฆฌ์คํธ- ์กฐ๊ธ ๋ ์ ํํ๊ฒ๋, LRU์ MRU ๋ฆฌ์คํธ๊ฐ ๊ฒฐํฉ๋ ํํ
- ๊ฐ๊ฐ New ์๋ธ๋ฆฌ์คํธ์(MRU), Old ์๋ธ๋ฆฌ์คํธ(LRU)๋ก ๊ด๋ฆฌํ๋ค.
- ์๋ก์ด ํ์ด์ง๋ New ๋ฆฌ์คํธ์ tail๊ณผ Old ๋ฆฌ์คํธ์ head์ ์ ์ ์ ์ฝ์ ๋๋ค.
- ๋์คํฌ ์ฝ๊ธฐ๋ฅผ ์ต์ํ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
- InnoDB์ ๋ฐ์ดํฐ ์ฐพ๋ ๊ณผ์
- ํ์ํ ๋ ์ฝ๋๊ฐ ์ ์ฅ๋ ํ์ด์ง๊ฐ ๋ฒํผ ํ์ ์๋์ง ๊ฒ์ฌ. (InnoDB ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค๋ก ํ์ด์ง ์ฐพ๊ธฐ, ํด๋น ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ๋ฒํผ ํ์์ ํ์ด์ง ๊ฒ์, ๋ฒํผ ํ์์ ์ด๋ฏธ ํ์ด์ง๊ฐ ์๋ค๋ฉด ํด๋น ํ์ด์ง์ ํฌ์ธํฐ๋ฅผ New์๋ธ๋ฆฌ์คํธ ๋ฐฉํฅ์ผ๋ก ์น๊ธ)
- ๋์คํฌ์์ ํ์ํ ๋ฐ์ดํฐํ์ด์ง๋ฅผ ๋ฒํผ ํ์ ์ ์ฌ, ์ ์ฌํ ์ดํ์ LRU ํค๋ ๋ถ๋ถ์ ์ถ๊ฐ
- ๋ฒํผ ํ์ ์์ฃผํ๋ ํ์ด์ง๋ ์ต๊ทผ ์ ๊ทผ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก age๊ฐ ๋ถ์ฌ๋จ
- ํ์ํ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์ ๊ทผ๋๋ค๋ฉด ํด๋น ํ์ด์ง์ ์ธ๋ฑ์ค ํค๋ฅผ ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค์ ์ถ๊ฐ
- ์ฆ ์์ฃผ ์ฌ์ฉ๋๋ค๋ฉด MRU์์ญ์์ ์ค๋ ์ด์๋จ๊ณ , ๋ฐ๋๋ก๋ LRU๋์ผ๋ก ๋ฐ๋ ค๋์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋จ
flush ๋ฆฌ์คํธ- ๋์คํฌ๋ก ๋๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ ํ์ด์ง์ ๋ณ๊ฒฝ ์์ ๊ธฐ์ค์ ํ์ด์ง ๋ชฉ๋ก์ ๊ด๋ฆฌ.
- ์ฝ์ ์ํ์์ ์์ ์ด ์๋ค๋ฉด ํ๋ฌ์ ๋ฆฌ์คํธ์ ์ค๋ฅด๊ณ , ๊ด๋ฆฌ๋๋ค๊ฐ ๋์คํฌ์ ๊ธฐ๋ก๋จ
- ๋ณ๊ฒฝ์ด ๋์ด ํ์ด์ง์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋๋ฉด ์๊น ๋ณธ ๋ฆฌ๋ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ (๋ณ๊ฒฝ์) ๊ณผ์ ์ด ์ผ์ด๋จ.
- ๋ฆฌ๋ ๋ก๊ทธ๊ฐ ๋์คํฌ๋ก ๊ธฐ๋ก๋๋ค๊ณ ํด์ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ๋์คํฌ๋ก ๊ธฐ๋ก๋๋ค๋๊ฒ์ ํญ์ ๋ณด์ฅํ์ง๋ ์์
free ๋ฆฌ์คํธ- ์ค์ ๋ฐ์ดํฐ๋ก ์ฑ์์ง์ง ์๋ ์ฌ์ ๊ณต๊ฐ
- ์ฌ์ฉ์์ ์ฟผ๋ฆฌ๊ฐ ์๋กญ๊ฒ ๋์คํฌ์ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฝ์ด์์ผํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ
๋ฒํผ ํ๊ณผ ๋ฆฌ๋ ๋ก๊ทธ
- ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์คํฌ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆด ์ ์๋ ์ํฉ์ด ์๋๋ผ๋ฉด, ๋ฒํผํ์ ๋๋ฆฌ๋ฉด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋นจ๋ผ์ง
- ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ์ ธ๋ณด๋ฉด InnoDB ๋ฒํผ ํ์ ์ฑ๋ฅ ํฅ์์ ์ํด ๋๊ฐ์ง ๊ด์ ์ผ๋ก ์ ๊ทผํจ
๋ฐ์ดํฐ ์บ์,๋ฒํผ๋ง - ๋ฒํผํ ๋๋ฆฌ๋๊ฑด ์ ์์ ๊ด์ฌ
- ๋ฒํผ๋ง์ ๋๋ฆฌ๋ ค๋ฉด ๋ฒํผํ๊ณผ ๋ฆฌ๋ ๋ก๊ทธ์ ๊ด๊ณ๋ฅผ ์์์ผ ํ๋ค๊ณ ํ๋ค.
- ๋ฒํผํ์ ํด๋ฆฐํ์ด์ง์ ๋ํฐํ์ด์ง(๋์คํฌ์์ ์ฝ์ด์จ ์ดํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ํ์ด์ง) ๋ชจ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฆฌ๋ ๋ก๊ทธ๋ 1๊ฐ ์ด์์ ๊ณ ์ ํฌ๊ธฐ ํ์ผ์ ์ฐ๊ฒฐํด์ ์ํ ๊ณ ๋ฆฌ์ฒ๋ผ ์ฌ์ฉ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ณ์ ๋ฐ์ํ๋ฉด ๋ฆฌ๋ ๋ก๊ทธํ์ผ์ ๊ธฐ๋ก๋๋ ๋ก๊ทธ ์ํธ๋ฆฌ๋ ์ด๋ ์๊ฐ ๋ค์ ์๋ก์ด ๋ก๊ทธ ์ํธ๋ฆฌ๋ก ๋ฎ์ด์์์ง
- ๊ทธ๋์ ๋ฆฌ๋ ๋ก๊ทธํ์ผ์์ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ๊ณต๊ฐ๊ณผ ๋ถ๊ฐ๋ฅํ ๊ณต๊ฐ์ ๊ตฌ๋ถํด์ ๊ด๋ฆฌํด์ผํ๋๋ฐ, ๋ถ๊ฐ๋ฅํ๊ณต๊ฐ์
ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ๋ผ๊ณ ํ๋ค. - ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ์ํ๋์ด ์ฌ์ฌ์ฉ๋๋๋ฐ, ๋งค ๊ธฐ๋ก์๋ง๋ค ๋ก๊ทธํฌ์ง์ ์ด ์ฆ๊ฐ ์ด๊ฒ์ LSN์ด๋ผ๊ณ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํฌ์ธํธ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ๋ฆฌ๋ ๋ก๊ทธ์ ๋ฒํผํ์ ๋ํฐํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋๊ธฐํํ๋๋ฐ
- ๋ฐ์ํ ์ฒดํฌํฌ์ธํธ ์ค ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํธ ์ง์ ์ LSN์ด ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ์์์
- ํ์ง๋ง ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ๋ง์ง๋ง์ ๊ณ์ํด์ ์ฆ๊ฐํ๊ธฐ์ ์ฒดํฌํฌ์ธํธ์ ๋ฌด๊ด
- ๊ทธ๋์ ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํธ์ lsn๊ณผ ๋ง์ง๋ง ๋ฆฌ๋ ๋ก๊ทธ ์ํธ๋ฆฌ์ lsn์ ์ฐจ์ด๋ฅผ ์ฒดํฌํฌ์ธํธ์์ด์ง๋ผ๊ณ ํจ
- ๊ฒฐ๋ก ์ ์ผ๋ก ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ ํฌ๊ธฐ๊ฐ ์ ๋ค๋ฉด ๋๋ฌด ์ ์ ๋ํฐ ํ์ด์ง์ ์ ํ๋๋ฌธ์ ์ฐ๊ธฐ๊ฐ ์์ฃผ์ผ์ด๋๊ฒ ๋๊ณ , ์ด๋ฌ๋ฉด ๋ฒํผํ์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์๋ด์ผ ์ฐ๊ธฐ ๋ฒํผ๋ง์ ํจ๊ณผ๋ ์ ํ ์๋ค.
- ๋ฐ๋๋ก ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ ํฌ๊ธฐ๊ฐ ์ ์ฒด ๋ฒํผํ์ ๋นํด ํฐ๋ฌด๋ ์์ด ๋๋ค๋ฉด ๋จ ํ ์๊ฐ์ ๋๋ฌด ํฐ ๋์คํฌ ์ฐ๊ธฐ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
๋ฒํผ ํ ํ๋ฌ์
- ๋ํฐํ์ด์ง๋ค์ ๋์คํฌ ๋๊ธฐํ๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋๊ฐ์ง์ ๊ธฐ๋ฅ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ค.
- ํ๋ฌ์ ๋ฆฌ์คํธ ํ๋ฌ์
- ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ์ฌํ์ฉ์ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ์ค๋๋ ๋ฆฌ๋ ๋ก๊ทธ ์ํธ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๊ณต๊ฐ์ ๋น์์ผํ๋ค.
- ๊ทธ๋ฌ๋ ค๋ฉด ๋น์ฐํ ๋ํฐํ์ด์ง๊ฐ ๋จผ์ ๋์คํฌ๋ก ๋๊ธฐํ ๋ผ์ผ ํ๋ค.
- ๊ทธ๋ฌ๊ธฐ ์ํด์ flush list flush ํจ์๋ฅผ ํธ์ถํด์ ์ด๋ฅผ ์ํํ๋ค.
innodb_page_cleaners: ๋ํฐํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋๊ธฐํํ๋ ํด๋ฆฌ๋ ์ค๋ ๋์ ๊ฐฏ์innodb_buffer_pool_instances: ์ฌ๋ฌ๊ฐ์ ๋ฒํผํ ์ธ์คํด์ค๋ฅผ ๋์์ ์ฌ์ฉํ๋๋ฐ ๊ทธ ๊ฐฏ์ ์ฌ๊ธฐ์ ์ธ๊ธ๋ ๊ฒ์ ํด๋ฆฌ๋ ์ค๋ ๋์ ๊ฐฏ์๋ฅผ ์๋์ ์ผ๋ก ๋ง์ถฐ์ฃผ๋๊ฒ ๋ํดํธ๋ก ๋์ด์์ผ๋ฉฐ ๊ตณ์ด ๋ณ๊ฒฝํ ์ด์ ๊ฐ ์๋ค๋ ์ธ๊ธ๊ณผ ํจ๊ปinnodb_max_dirty_pages_pct: ๋ฒํผํ์์ ๋ํฐํ์ด์ง๊ฐ ์ฐจ์งํ ์ ์๋ ๋น์จinnodb_max_dirty_pages_lwm: ์ฐ๊ธฐ ํญ๋ฐ (Disk IO Burst)์ ๋๋นํ์ฌ ํน์ ๋น์จ ์ด์์ธ๊ฒฝ์ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐ๊ธฐ๋ฅผ ํ๋๋ก ์ค์ ํ๋ ํผ์ผํ ์ด์ง- ๊ทธ์ธ์๋ capacity์ ๊ฐ์ ๊ฐ๋ค์ด ์๋๋ฐ, ์ฌ์ค ์ฌ๊ธฐ ๋๋จธ์ง ์ธ์ธํ ์ค์ ๋ค์ hdd๋ฅผ ์ฐ๋ ์์ ์น๋ช ์ ์ด๋ disk io๋ฅผ ์ค์ด๋ ค๊ณ ํ ๋ ธ๋ ฅ์ ๋ ๊ฐ๊น์์ ์ ๋ง ์๋ฏผํ์ง ์์ผ๋ฉด ์ ๊ฑด๋ค์ด๋ ๋ ๊ฒ ๊ฐ๋ค.
- LRU ๋ฆฌ์คํธ ํ๋ฌ์
- ํ๋ฆฌํ์ด์ง๋ก ์ฎ๊ธด๋ค, ์ ๋ ์ ์ธํ๊ณค ํฐ ์ฐจ์ด ์๋ค.
๋ฒํผ ํ ์ํ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ
- ์ ๋ฉ๋ชจ๋ฆฌ ์ฆ ๋ฒํผํ์ ์ฌ๋ผ๊ฐ์ํ(warmed up)์ ์ฟผ๋ฆฌ๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋๋น ์์ญ๋ฐฐ ๋น ๋ฆ
- ์์ ์๋ ์ด๋ถ๋ถ์ ๋ํ ๊ด๋ฆฌ๊ฐ ์ ์๋์ด ์๋น์ค์ ํํ ์ด๋ธ ์ค์บ์ ์ ๋ฐ์์ผ์ ์๋ฐ์ ์ ๋งค๋ด์ผํ๊ฒ ์ํํ์
- ์ง๊ธ์ ๊ทธ๋ด ํ์ ์์ด ๋ฒํผ ํ ๋คํ๋ฅผ ํตํด์ ์ฌ์คํ๋์ด๋ ๋ฒํผ๊ฐ ์ฑ์์ ธ ์๋๋ก ๊ด๋ฆฌ
๋ฒํผ ํ์ ์ ์ฌ ๋ด์ฉ ํ์ธ
information schema->innodb_buffer_pageํ ์ด๋ธ์์ ๋ฒํผํ ํ์ธ๊ฐ๋ฅ
select
it.name table_name,
ii.name index_name,
ici.n_cached_pages n_cached_pages
from information_schema.innodb_tables it
inner join information_schema.innodb_indexes ii on ii.table_id = it.table_id
inner join information_schema.innodb_cached_indexes ici on ici.index_id = ii.index_id
where it.name=concat('employees','/','employess')
;
์ธ๋ ๋ก๊ทธ
- ์ฃผ ์ฌ์ฉ์ฒ๋ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํธ๋์ญ์ ๋ณด์ฅ๊ณผ ๊ฒฉ๋ฆฌ์์ค ๋ณด์ฅ
- ์ฟผ๋ฆฌ ์คํ ์์ ์ ์์ฑ๋๋ค.(ํธ๋์ญ์ ์ ์ํด)
์ธ๋ ๋ก๊ทธ ๋ ์ฝ๋ ๋ชจ๋ํฐ๋ง
- ์ผ๋จ ๊ด๋ฆฌ์ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค. 1์ต๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฆฌ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ dml์ด๋ฉด?
- ๊ทธ๋ฆฌ๊ณ ํธ๋์ญ์ ์ ๊ด๋ฆฌ๊ฐ ์๋๋ค๋ฉด, ์ธ๋๋ก๊ทธ๊ฐ ๋ค๋ฅธํธ๋์ญ์ ์ ์ํฅ์ ๋ฐ์ ์ธ๋๋ก๊ทธ๊ฐ ์ญ์ ๊ฐ ์ ๋ ์ ์๋ค.
- ํธ๋์ญ์ A๊ฐ ์คํ๋๋ ๋์ B์ C๊ฐ dml ํธ๋์ญ์ ์ ๋ ๋ฆฐ๋ค๋ฉด, b์ c์ Undo ๋ก๊ทธ๋ ์ญ์ ๋์ง ์์.
- ์ด์ ๋ ํธ๋์ญ์ A๊ฐ ์ฌ์ ํ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ.
- 8.0 ์ดํ ์ธ๋๋ก๊ทธ๊ฐ ๊ฐ์ ๋์ด ์ธ๋๋ก๊ทธ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ๋์คํฌ ๊ณต๊ฐ์ ์ค์ด๋๊ฒ ๊ฐ๋ฅํด์ก์
- ์ฐธ๊ณ ๋ก ํ ์ด๋ธ์คํ์ด์ค ์ธ ๋งํผ ์ด๋ ธ๋๋น ๋ฒํผํ์ ์ฌ๋ผ๊ฐ๊ธฐ๋ ํ์ง๋ง ๋ก๊ทธ์์ฒด๋ ๋์คํฌ
์ฒด์ธ์ง ๋ฒํผ
- ์ฒด์ธ์ง ๋ฒํผ๋ ์ธ๋ฑ์ค ํ์ด์ง์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋์คํฌ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ ์ฅํ๋ ๊ณต๊ฐ ย
- InnoDB ๋ฒํผ ํ(Buffer Pool)์ ์ผ๋ถ๋ก ๊ด๋ฆฌ๋๋ฉฐ ๋ณด์กฐ ์ธ๋ฑ์ค(Secondary Index) ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅ ย
- ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฆ์ ๋์คํฌ์ ๊ธฐ๋กํ์ง ์๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ์ฌ ์ฑ๋ฅ ์ต์ ํ ย
- ๋ฐ์ดํฐ๊ฐ ์กฐํ๋ ๋ ๋์คํฌ์ ๋๊ธฐํ(merge)๋๋ฉฐ, ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ์๋์ผ๋ก ๋ณํฉ ย
- ๋์ ์์
- ์ฌ์ฉ์๊ฐ ๋ณด์กฐ ์ธ๋ฑ์ค์ ๋ํ DML(INSERT, DELETE, UPDATE)์ ์คํ ย
- ๋ณ๊ฒฝ๋ ์ธ๋ฑ์ค ํ์ด์ง๊ฐ ๋ฒํผ ํ์ ์๋ค๋ฉด, ์ฒด์ธ์ง ๋ฒํผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋ก ย
- ์ดํ ํด๋น ์ธ๋ฑ์ค ํ์ด์ง๊ฐ ์กฐํ๋๋ฉด ์ฒด์ธ์ง ๋ฒํผ์์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉ(merge) ย
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ์ผ์ ์๊ฐ๋ง๋ค ๋์คํฌ์ ๋ฐ์ ย
innodb_change_buffer_max_size์ค์ ์ ํตํด ํฌ๊ธฐ ์กฐ์ ๊ฐ๋ฅ ย- ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋๋ฉด ์ฒด์ธ์ง ๋ฒํผ๋ ๋กค๋ฐฑ๋จ ย
- ๊ธฐ๋ณธ ํค(Primary Key)์๋ ์ ์ฉ๋์ง ์์ผ๋ฉฐ ๋ณด์กฐ ์ธ๋ฑ์ค์๋ง ์ฌ์ฉ ย
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ณด์กฐ ์ธ๋ฑ์ค๊ฐ ๋ง์ ํ ์ด๋ธ์์ ์ฑ๋ฅ ์ต์ ํ ํจ๊ณผ๊ฐ ํผ
๋ฆฌ๋ ๋ก๊ทธ
-
๋ฆฌ๋ ๋ก๊ทธ๋ ํธ๋์ญ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋์คํฌ์ ์๊ตฌ ๋ฐ์ํ๊ธฐ ์ ์ ๋ก๊ทธ๋ก ๊ธฐ๋กํ๋ ๊ตฌ์กฐ
-
์์คํ ์ฅ์ ๋ฐ์ ์ ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ์ด์ฉํด ๋ฏธ์๋ฃ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณต๊ตฌํ ์ ์์
-
InnoDB๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋จผ์ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋กํ ํ ๋ฐ์ดํฐ ํ์ด์ง์ ๋ฐ์
-
๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ํตํด MySQL์ด ACID ํน์ฑ์ ๋ณด์ฅํ๋ฉฐ, COMMIT๋ ๋ฐ์ดํฐ์ ์์์ฑ์ ์ ์ง
-
์ฌ์ฉ์๊ฐ DML(INSERT, UPDATE, DELETE)์ ์คํํ๋ฉด ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ InnoDB ๋ฒํผ ํ์ ๋ฐ์๋จ
-
๋ณ๊ฒฝ๋ ๋ด์ฉ์ด ๋ฆฌ๋ ๋ก๊ทธ ๋ฒํผ์ ๊ธฐ๋ก๋ ํ, ์ผ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๊ฑฐ๋ COMMIT ๋ฐ์ ์ ๋ฆฌ๋ ๋ก๊ทธ ๋ฒํผ์ ๋ด์ฉ์ ๋์คํฌ์ ์์ฐจ์ ์ผ๋ก ๊ธฐ๋ก
-
์ดํ InnoDB์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ฌ์ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋ฐ์ดํฐ ํ์ผ๋ก ๋ฐ์
-
์์คํ ์ฅ์ ๋ฐ์ ์ ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณต๊ตฌ
-
๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ib_logfile0, ib_logfile1 ๋ฑ์ ํ์ผ๋ก ์ ์ฅ๋๋ฉฐ ์ํ ๋ฐฉ์์ผ๋ก ๋์
-
ํน์ ํฌ๊ธฐ์ ๋๋ฌํ๋ฉด ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฌ์ฉ
-
innodb_log_files_in_group ์ค์ ์ ํตํด ๋ค์ค ๋ก๊ทธ ํ์ผ์ ๊ตฌ์ฑํ ์ ์์
-
innodb_log_file_size๋ ๊ฐ ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ๋๋ฌด ์์ผ๋ฉด ์ฒดํฌํฌ์ธํธ๊ฐ ์์ฃผ ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์
-
ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ๋ณต๊ตฌ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์
-
innodb_flush_log_at_trx_commit ๊ฐ์ ๋ฐ๋ผ ๋ฆฌ๋ ๋ก๊ทธ์ ๋์คํฌ ๋ฐ์ ์์ ์ด ์กฐ์ ๋จ
-
0์ผ๋ก ์ค์ ํ๋ฉด 1์ด๋ง๋ค ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํ์ฌ ์ฑ๋ฅ์ด ํฅ์๋์ง๋ง ์ฅ์ ๋ฐ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ ์ ์์
-
1์ ๋งค ํธ๋์ญ์ COMMIT ์ ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํ์ฌ ์์ ์ฑ์ ๋ณด์ฅํจ
-
2๋ ๋งค COMMIT ์ OS ๋ฒํผ์ ๊ธฐ๋กํ๊ณ , 1์ด๋ง๋ค ๋์คํฌ์ ๊ธฐ๋กํ์ฌ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๊ท ํ์ ๋ง์ถค
-
WAL ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๋จผ์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ์ฌ ์ฅ์ ๋ฐ์ ์ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํจ
-
๋ก๊ทธ ๋ฒํผ๋ ๋ฆฌ๋ ๋ก๊ทธ๊ฐ ๋จผ์ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ์ดํ ๋์คํฌ๋ก ํ๋ฌ์๋จ
-
์ฒดํฌํฌ์ธํธ๋ ๋ฆฌ๋ ๋ก๊ทธ ํฌ๊ธฐ ์ด๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํน์ ์์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ ํ์ผ์ ๋ฐ์ํ๋ ๊ณผ์
-
๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ์ํ ๊ตฌ์กฐ์ด๋ฏ๋ก ์ฌ์ฉ๋ ๋ก๊ทธ๋ ์ฒดํฌํฌ์ธํธ ์ดํ ๋ฎ์ด์ฐ๊ธฐ๋จ
-
ํธ๋์ญ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ฉฐ ์ฅ์ ๋ฐ์ ์ ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํจ
-
๋ฐ์ดํฐ ํ์ด์ง ๋ณ๊ฒฝ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋์คํฌ์ ๊ธฐ๋ก๋๋ฏ๋ก ์ฑ๋ฅ์ด ํฅ์๋จ
-
์์ฐจ์ ์ธ ๋ก๊ทธ ์ฐ๊ธฐ๋ก ์ธํด ๋์คํฌ I/O ๋ถํ๊ฐ ๊ฐ์ํจ
-
๋ฆฌ๋ ๋ก๊ทธ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์๋ก์ด ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์ง์ฐ๋ ์ ์์ผ๋ฏ๋ก ์ ์ ํ ํฌ๊ธฐ ์ค์ ์ด ํ์ํจ
์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค
- ์์ฃผ ์ฌ์ฉ๋๋ ํ์ด์ง์ innodb์์ง์ด ์ง์ ์์ฑํ๋ ์ธ๋ฑ์ค
- b+ ํธ๋ฆฌ๋ ์ข ๋จ๋ ธ๋๊น์ง ๊ฐ์ผ ๋ ์ฝ๋๊ฐ ์์ผ๋๊น ์ด๊ฑธ ๊ทธ๋ฅ ํด์ฌ๋ก ์ต์ ํ์ํด
- ํด์ฌ๊ฐ์ ํค๋ก๋ ์ธ๋ฑ์ค ๊ณ ์ ๊ฐ + ์ธ๋ฑ์ค ์ค์ ํค๊ฐ ์ ์
- ์์ ๋ฒ์ ๊น์ง๋ ์ด๋ํฐ๋ธ ํด์ฌ ์ธ๋ฑ์ค๋ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด์ธ ์ด์ ๋ก ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค์ ๊ฒฝํฉ์ด ์ฌํ๋ค ๊ทธ๋์ 8.0๋ถํฐ๋ ๋ด๋ถ ์ ๊ธ ๊ฒฝํฉ์ ์ค์ด๊ธฐ์ํด ์ด๋ํฐ๋ธ ํด์ฌ ์ธ๋ฑ์ค์ ํํฐ์ ๊ธฐ๋ฅ์์ ๊ณตํ๋ค (๋์ถฉ ์ด๊ฒ๋ ํ๋๋ผ ๊ฒฝํฉ์ด ์ฌํ๋๋ฐ ํํฐ์ ์ ํด์ค๋ค๋ ์ด์ผ๊ธฐ)
- ๋์ ์๋๋ ๊ฒฝ์ฐ
- ๋์คํฌ๋ฐ์ดํฐ๊ฐ ๋ฒํผํ์ด๋ ๋น์ทํ๊ฒฝ์ฐ
- ๋๋ฑ์กฐ๊ฑด ๊ฒ์๋๋ฑ๋น๊ต์ in์ฐ์ฐ ๋ง์๊ฒฝ์ฐ
- ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ์ค์์ ์ผ๋ถ๋ฐ์ดํฐ์ ์ง์ค๋๋๊ฒฝ์ฐ
- ๋์ ์๋๋ ๊ฒฝ์ฐ
- ๋์คํฌ์ฝ๊ธฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ
- ํน์ ํจํด์ ์ฟผ๋ฆฌ๊ฐ ๋ง์๊ฒฝ์ฐ (join like)
- ๋งค์ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ ์ด๋ธ๋ ใ ์ฝ๋๋ฅผ ํญ๋๊ฒ ์ฝ๋ ๊ฒฝ์ฐ
ํธ๋์ญ์ ๊ณผ ์ ๊ธ
์ ๊ธ๊ณผ ํธ๋์ญ์ ์ ์๋ก ๋น์ทํ ๊ฐ๋ ๊ฐ์ง๋ง, ์ฌ์ค ์ ๊ธ์ ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด๊ณ ํธ๋์ญ์ ์ ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด๋ค.
MySQL ์์ง์ ์ ๊ธ
๊ธ๋ก๋ฒ ๋ฝ
FLUSH TABLES WITH READ LOCK์ผ๋ก ํ๋
- MySQL์์ ์ ๊ณตํ๋ ์ ๊ธ ๊ฐ์ด๋ฐ ๊ฐ์ฅ ๋ฒ์๊ฐ ํฌ๋ค.
- ์๋ฒ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, ํ ์ด๋ธ์ ๋ฌผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฌ๋ผ๋ ์ํฅ์ ๋ฏธ์น๋ค.
- sqldump์์ค์ผ๋ก ๋ฐฑ์
์ ํ ๋๋ ์ฌ์ฉํ๊ณ ๊ทธ๋ง์ ๋ 8.0์์๋ ๋ฐฑ์
๋ฝ์ ์ฌ์ฉ
- ๋ฐฑ์ ๋ฝ์ ๊ฒฝ์ฐ ๊ฐ์ฒด db/table๋ฑ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ ๋ณ๊ฒฝ์ ๋งํ๊ณ , ์ ์ ๊ด๋ จ๋ ๋งํ์ง๋ง ์ผ๋ฐ์ ์ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๋ค.
ํ ์ด๋ธ ๋ฝ
LOCK TABLES table_name [read | write] ๋ก ํ๋
- ๋ง์ฐฌ๊ฐ์ง๋ก ํน๋ณํ ์ํฉ์ด ์๋๋ฉด, ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ผ ์๋ค.
- DDL์ ์ ๊น ๊ฑธ๋ฆผ
๋ค์๋ ๋ฝ
- ๋ง๊ทธ๋๋ก ํน์ ๋ฌธ์์ด์๋ํ ๋ฝ์ ํ๋ํ๋๊ฒ
- ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ๊ฒฝ์์กฐ๊ฑด์ด๋ ๋ฐ์ดํฐ ๋๊ธฐํ์ ์ฐ์ด๊ธฐ๋ํจ
๋ฉํ๋ฐ์ดํฐ ๋ฝ
- ๋ช ์์ ์ด์ง ์์
InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ ๊ธ
- ๋ ์ฝ๋ ๊ธฐ๋ฐ ๋ฝ์ ์ง์
- ์๋๋ ์ ๊ธ ์ ๋ณด๋ฅผ ์ป๋๊ฒ ๊น๋ค๋ก์ ๋๋ฐ,
information_schema๋ฐ์ดํฐ๋ฒ ์ด์ค์INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITSํ ์ด๋ธ์ ์กฐ์ธํด์ ํ์ธ๊ฐ๋ฅ - ์ต๊ทผ์๋
Performance Schema๋ฅผ ์ด์ฉํด์ ๋ชจ๋ํฐ๋ง๋ ๊ฐ๋ฅ
๋ ์ฝ๋ ๋ฝ
- ๋ค๋ฅธ ๋๋น์ ๋ ์ฝ๋๋ฝ์ด๋ ๊ฑฐ์ ๋๊ฐ์ง๋ง, InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ์ ๊ทผ๋ค.
- ์ธ๋ฑ์ค๊ฐ ํ๋๋ ์๋ ํ ์ด๋ธ์ด๋๋ผ๋ ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑ๋ ํด๋ฌ์คํฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐญ ๋ฝ
- MySQL๋ง์ ํน์ํ ๋ฝ
- ๋ ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ๋ ์ฝ๋์ ๋ฐ๋ก ์ธ์ ํ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ธ
- ๋ฅ์คํฐ ํค ๋ฝ๊ณผ ๊ฐ์ด ์ค๋ช ๋์ด์ผํจ
๋ฅ์คํธ ํค ๋ฝ
- ๋ ์ฝ๋๋ฝ๊ณผ ๊ฐญ๋ฝ์ ํฉ์ณ๋์ ํํ
STATEMENTํฌ๋งท์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ด๋ค๊ณ ํจ- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ ํ๋ฆฌ์นด ์๋ฒ์์ ์คํ๋ ๋, ์์ค ์๋ฒ์์ ๋ง๋ค์ด๋ธ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋๋ก ๋ณด์ฅํ๋๊ฒ์ด ์ฃผ๋ชฉ์
- ๊ทผ๋ฐ ๋ฐ๋๋ฝ์ด ์๊ทผ ๊ฑธ๋ ค์ ๊ทธ๋ฅ ROW ํฌ๋งท์ ๋ก๊ทธ๋ฅผ ์ฐ๊ธฐ๋ฅผ ๊ถํ๋ค.
- ์ ์ฒด์ ์ธ์ค๋ช
AUTO_INCREMENT ๋ฝ
- ํ ์ด๋ธ๋ฝ์ด์๋ค.
- ๋ช ์์ ์ผ๋ก ์ป์ ๋ฐฉ๋ฒ์ ์๋ค.(postgres ์ต๊ณ ..)
์ธ๋ฑ์ค์ ์ ๊ธ
- ์ธ๋ฑ์ค ๊ธฐ๋ฐ ๋ฝ์ด๊ธฐ ๋๋ฌธ์, ์ ๋ฐ์ดํธ๋๋ ๋ ์ฝ๋๊ฐ ์ธ๋ฑ์ค๊ฐ ์๊ฑธ๋ ค ์๋ค๋ฉด, ํด๋นํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ฝ์ด๊ฑธ๋ฆฐ๋ค. ํํ ์ด๋ธ ์ค์บ์ ํ๋ฉด ํ ์ด๋ธ๋ฝ์ด ๊ฑธ๋ฆฐ๋ค.
CREATE TABLE orders (
ย ย id INT AUTO_INCREMENT PRIMARY KEY,
ย ย customer_id INT,
ย ย amount DECIMAL(10,2),
ย ย status VARCHAR(20),
ย ย INDEX idx_customer (customer_id) -- customer_id์ ์ธ๋ฑ์ค ์ถ๊ฐ
) ENGINE=InnoDB;
INSERT INTO orders (customer_id, amount, status) VALUES
(1, 100.00, 'pending'),
(1, 200.00, 'pending'),
(1, 300.00, 'pending'),
(2, 400.00, 'pending'),
(2, 500.00, 'pending');
BEGIN;
UPDATE orders SET status = 'completed' WHERE customer_id = 1 AND amount = 300;
-- customer id 1์ธ ์ฃผ๋ฌธ rows ๋ค์ ๊น
๋ ์ฝ๋ ์์ค์ ์ ๊ธ ํ์ธ ๋ฐ ํด์
information_schema๋ deprecated ๋๋์ค performance_schema์ data_locks, data_lock_waits๋ฅผ ์์ฃผ๋ก ์ฌ์ฉํ ๊ฒ
์กฐํ ์์๋ [[MySQL-Record-Lock-Queries]] ์ฌ๊ธฐ์ ๋ณ๋ ์ ๋ฆฌ
MySQL์ ๊ฒฉ๋ฆฌ ์์ค
| ๊ฒฉ๋ฆฌ ์์คย ย ย ย ย | Dirty Read | Non-repeatable Read | Phantom Read | ์ค๋ช |
|---|---|---|---|---|
| READ UNCOMMITTED | O ย ย ย ย | O ย ย ย ย ย ย ย ย | Oย ย ย ย ย | ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ |
| READ COMMITTED ย | X ย ย ย ย | O ย ย ย ย ย ย ย ย | O | ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ปค๋ฐํ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์์ (Oracle ๊ธฐ๋ณธ๊ฐ) |
| REPEATABLE READย | X ย ย ย ย | X ย ย ย ย ย ย ย ย | O | ๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ (InnoDB์์๋ ๋ฐฉ์ง๋จ) (MySQL ๊ธฐ๋ณธ๊ฐ) |
| SERIALIZABLE | X ย ย ย ย | X ย ย ย ย ย ย ย ย | Xย ย ย ย ย | ๋ชจ๋ ํธ๋์ญ์ ์ ์ง๋ ฌํํ์ฌ ์ฒ๋ฆฌ, ๋์์ฑ์ ๊ฑฐ์ ํ์ฉํ์ง ์์ |
- Dirty Read: ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ
- Non-repeatable Read: ๋์ผํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์์ ๋ ๋ค๋ฅธ ๊ฐ์ด ๋ฐํ๋๋ ๊ฒ
- Phantom Read: ๋์ผํ ํธ๋์ญ์ ๋ด์์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๊ฑฐ๋ ์ญ์ ๋๋ ๊ฒ์ด ๊ฐ์ง๋๋ ํ์
- ์๋๋ก ๊ฐ์๋ก ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ ๋๊ฐ ๋์์ง๋ฉฐ, ๋์์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
- SQLํ์ค ์
REPEATABLE READ์์ Pantom read๋ ๋ฐ์ํ ์ ์์ง๋ง, MySQLํน์ฑ์ ๋ฐ์ํ์ง ์๋๋ค.
์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค ์ฉ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฃผ๋ก READ COMMITTED, REPEATABLE READ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ค.
READ_UNCOMMITTED
- Dirty Read๊ฐ ๋ฐ์ํจ.
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์ธ์ ํ์ง ์์์ ๋๋ก ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์.
READ COMMITTED
- ์์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์งํ์ค์ด๋ฉด, ์ธ๋๋ก๊ทธ์์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด๊ฐ๋ค๋ ๊ฒ.
- ‘์ผ๋ฐ์ ์ธ’์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํธ๋์ญ์ ๋ ๋ฒจ
- Non-repeatable-read๋ ๋ฐ์ํจ
- ์ฐธ๊ณ ๋ก READ_COMMITTED, REPEATABLE READ ์์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ select
- READ_COMMITED๋ ํ ํธ๋์ญ์ ์งํ์ค์ ๋ค๋ฅธํธ๋์ด ์ปค๋ฐ์ ์ฑ๊ณตํ๋ฉด ๊ทธ ํธ๋์ญ์ ์ ๋์ผํ select๋ฅผ ๋ณด์ฅ๋ฐ์ง ๋ชปํ๋ค.
REPEATABLE READ
- READ COMMITTED์์ ์ฐจ์ด์ ์, ์ธ๋์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ๋ช๋ฒ์งธ ์ด์ ๋ฒ์ ์ผ๋ก ์ฐพ์๋ค์ด๊ฐ๋์ ์๋ค.
- ๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ธ๋์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋ผ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ค.
- REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ MVCC๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ์ค์ธ ํธ๋์ญ์ ๊ฐ์ด๋ฐ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ํธ๋์ญ์ ๋ฒํธ๊ฐ ์์ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์ ๊ฐ ์๋ค.
- ๊ทธ๋ ๋ค๊ณ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์ ๋ฒํธ ์ด์ ์ ํธ๋์ญ์ ์ ์ํด ๋ณ๊ฒฝ๋ ๋ชจ๋ ์ธ๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ๊ฒ์ ์๋๋ค.
- ๋ ์ ํํ๊ฒ๋ ํน์ ํธ๋์ญ์ ๋ฒํธ์ ๊ตฌ๊ฐ ๋ด์์ ๋ฐฑ์ ๋ ์ธ๋๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋ผ์ผ ํ๋ค.
1. A ํธ๋์ญ์
์ด 100๋ฒ์ผ๋ก ์์
2. B ํธ๋์ญ์
์ด 101๋ฒ์ผ๋ก A๊ฐ ๋ณด๊ณ ์๋ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ
3. C ํธ๋์ญ์
์ด 102๋ฒ์ผ๋ก ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ
์ด ์ํฉ์์ READ COMMITTED๋ B,C ํธ๋์ญ์
์ ์ปค๋ฐ๊ณผ ํจ๊ป ํด๋น ๋ ์ฝ๋์ ์ธ๋๋ก๊ทธ๋ฅผ ์ ๋ถ ์ญ์ ํ ์ '์์ง๋ง',
REPEATABLE READ์์๋ 100๋ฒ์ด ์คํ์ค์ธ๋์์ ์ธ๋๋ก๊ทธ๋ฅผ 100๋ฒ์ด์ ์ผ๋ก ์ญ์ ๋ฅผ ๋ชปํ๊ฒ ๋ง์์ค๋ค๋ ์ด์ผ๊ธฐ!
SERIALIZABLE
- ๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ์์ค์ด์, ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ์์ค
- ๋์ ์ฒ๋ฆฌ ์์ ์ ๋จ์ด์ง
- ํ์ค์ฑ๋ ์ ์์ง๋ง, ๊ทธ๋๋ง ๊ณ ๋ คํ๋ ์ด์ ๊ฐ pantom read์ธ๋ฐ mysql์์๋ ๊ทธ๊ฒ ์กฐ์ฐจ๋ ๋ฐฉ์ง๋ผ์ ์ฌ์ฉํ ์ด์ ๊ฐ ์ฌ์ค์ ์์
๋ฐ์ดํฐ ์์ถ
ํ์ด์ง์์ถ
- ์๋ฒ๊ฐ ๋์คํฌ์ ์ ์ฅํ๋ ์์ ์ ์์ถํ๊ณ , ๋ถ๋ฌ์ค๋ฉด ์์ถ์ด ํด์ ๋จ ์ฆ ๋ฒํผํ์ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ์ ์ฌ๋๋ฉด ์์ถ์ด ํด์ ๋ ์ํ๋ก๋ง ๊ด๋ฆฌ
- ์ด์์ฒด์ ์ ํ๋์จ์ด์์ ๋ ๋ค ์ง์ํด์ผ ์ ์๋ฏธํจ
- ๊ทธ๋์ ์ ์ฌ์ฉ์ํจ
ํ ์ด๋ธ์์ถ
- ์ผ๋ฐ์ ์ผ๋ก ํ์ฉ๋ ๋์
- ์๋์ ๊ฐ์ ๋จ์ ๋ ์์
- ๋ฒํผํ ๊ณต๊ฐ ํ์ฉ๋ฅ ์ด ๋ฎ์
- ์ฟผ๋ฆฌ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋ฎ์
- ๋น๋ฒํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์ถ๋ฅ ์ด ๋จ์ด์ง
- ํ์ด์ง ํฌ๊ธฐ์ ๋ฐ๋ผ์ ํ์ด์ง ํ๊ฒ(์์ถ ๋ชฉํ ํฌ๊ธฐ)๋ฅผ ์ค์ ํ๋๋ฐ, ์์ถ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ์ ์๊ณ ์ค์ ๋ก ํ๊ฒ๋ณด๋ค ํฌ๊ฒ๋๋ฉด ์คํ๋ฆฟ์ ํ๋ค.
- ํ
์คํธ๋ฅผ ์ ํด๋ณด๊ณ ์ค์ ํด์ผํจ
- ์๋ฅผ๋ค์ด ํ๊ฒ์ด 4kb, 8kb์ธ๋ฐ ์ค์ ๊ฒฐ๊ณผ ์ฐจ์ด๊ฐ ๋ณ๋ก ์๋๋ค๋ฉด 8kb
๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ด๋ธ์์ถ์์๋ InnoDB ๋ฒํผํ๋ก์ฌ๋ฆฌ๋ฉด, ์์ถ๋ํ์ด์ง์ ํด์ ๋ ํ์ด์ง ๋ชจ๋๋ฅผ ๊ด๋ฆฌํด์ผํ๊ณ , ์์ถ ์์ฒด๊ฐ cpu์๋ชจ๊ฐ ์์ฒญ๋๊ธฐ์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผํ ๊ฒ
LZ77, Huffman Encoding์ ์ฌ์ฉ, ๊ด๋ จ ๋ด์ฉ ์ ๋ฆฌ -> [[๋ฐ์ดํฐ-์์ถ]]
๋ฐ์ดํฐ ์ํธํ
- ๋ค๋ฅธ ๋ถ๋ถ์์๋ ์ํธํ๊ฐ ๋์ง ์๊ณ ๋์คํฌ I/O ์ฆ ์ฐ๊ธฐ, ์ฝ๊ธฐ์์๋ง ์ํธํ ๋ณตํธํ๊ฐ ์ด๋ฃจ์ด์ ธ ์ฌ์ฉ์๋ ์ ๊ฒฝ์ ์ธ ํ์๋ ์์
- master key์ tablespace key(private key)๋ผ๋ ๋ ์ข ๋ฅ์ ํค๋ฅผ ์ด์ฉ
- ์ธ๋ถ ํค ๊ด๋ฆฌ ์๋ฃจ์ ํน์ ๋์คํฌ์ ํ์ผ์์ ๋ง์คํฐํค๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ํธํ๋ ํ ์ด๋ธ์ด ์์ฑ๋ ๋ ๋ง๋ค ํด๋น ํ ์ด๋ธ์ ์ํ ์์์ ํ ์ด๋ธ ์คํ์ด์ค ํค๋ฅผ ๋ฐ๊ธ.
- ๋ง์คํฐํค์ ๊ด๋ฆฌ๋ฅผ ์ ์ํด์ผํจ, ๋ง์คํฐํค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ธฐ์กด ํค๋ก ํ ์ด๋ธ์คํ์ด์คํค๋ฅผ ๋ณตํธํ ํ๊ณ ๋ค์ ์๋ก์ด ํค๋ก ์ํธํํจ
- ์ด๋ฐ ๊ตฌํ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด db๊ธฐ๋ฅ์ ์ด์ฉํ๊ธฐ ์ํด์ db์ํธํ๋ฅผ ํ๋๊ฒ ๋์(์ดํ๋ฆฌ์ผ์ด์ ์ํธํ๋ณด๋ค)
- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ ์ธ๋๋ก๊ทธ๋ ํ๋ฌธ์ผ๋ก ์ ์ฅ๋ ์ ์์ด ์ค์ ์ ์ ์
์ธ๋ฑ์ค
๋์คํฌ ์ฝ๊ธฐ ๋ฐฉ์
Random I/O์ Sequential I/O์ ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฟผ๋ฆฌํ๋์ ์ด๋ ์ ๋ ์ง์์ ๊ฐ์ถ ์ฌ์ฉ์๊ฐ ์ ๊ฐํ๊ณ ์๋ฏ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ ํ๋์ ์ด๋ป๊ฒ Disk I/O๋ฅผ ์ค์ด๋๋๊ฐ ๊ด๊ฑด์ผ ๋ ๊ฐ ์๋นํ ๋ง๋ค.
HDD vs SSD
ํ๋ฒ์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ฐจ I/O์์๋ SSD๊ฐ HDD๋ณด๋ค ์กฐ๊ธ ๋น ๋ฅด๊ฑฐ๋ ๊ฑฐ์ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์ด๊ธฐ๋ ํ๋ค. ํ์ง๋ง ๋๋ค I/O๊ฐ ํจ์ฌ ๋น ๋ฅด๋ค๋๊ฒ ์ฅ์ ์ด๋ค.
Random I/O vs Sequential I/O
- ์๋๋ ํ๋๋์คํฌ๋ ์ค์ ์ํ์ ๋๋ ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น๋ก ๋์คํฌ ํค๋๋ฅผ ์ด๋์ํจ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์์
- ๊ฑฐ๊ธฐ์ ๋์จ ์ฉ์ด
- ์ค์ 3๊ฐ์ ํ์ด์ง๋ฅผ ์ฝ์ ํ๋๋ผ๋, ์ฐ์์ ์ผ๋ก ์ฝ์ ํ๋๊ฒ๊ณผ ๋๋คํ ์์น์ ์ฝ์ ํ๋๊ฒฝ์ฐ ๋์คํฌ ํค๋๋ฅผ ๋๋ฆฌ๋ ์์คํ ์ฝ์ ํ์๊ฐ ์ธ๋ฐฐ ์ฐจ์ด + ๋์คํฌ ํ์ ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊น์ง
์ฌ์ค ์ฟผ๋ฆฌ๋ฅผ ํ๋ํด์ ๋๋ค i/o๋ฅผ ์์ฐจ i/o๋ก ๋ฐ๊ฟ์ ์คํํ ๋ฐฉ๋ฒ์ ๊ทธ๋ค์ง ๋ง์ง ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ํ๋ํ๋ ๊ฒ์ ๋๋คi/o ์์ฒด๋ฅผ ์ค์ฌ์ฃผ๋๊ฒ์ด ๋ชฉ์ ์ด๋ค. ์ฌ๋ฆฌ์ ๋๋ค i/o๋ฅผ ์ค์ธ๋ค๋ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๊ผญ ํ์ํ ๋ฐ์ดํฐ๋ง ์ฝ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ธ๋ฑ์ค๋?
์นผ๋ผ์ ๊ฐ๊ณผ ํด๋น ๋ ์ฝ๋๊ฐ ์ ์ฅ๋ ์ฃผ์๋ฅผ ํค๋ฐธ๋ฅ๋ก ์ผ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ ๋ค. ์ ๋ ฌ์ ์ ์งํ๋ค. sorted ๊ฒฐ๋ก ์ ์ผ๋ก ๋ฐ์ดํฐ์ ์ ์ฅ์ ์ฑ๋ฅ์ ํฌ์ํ๊ณ (์ ๋ ฌํ๋๋ผ), ์ฝ๊ธฐ์๋๋ฅผ ๋์ด๋ ๊ธฐ๋ฅ์ด๋ค. ์ด ์ฑ ์์๋ ํค๋ผ๋ ๋ง๊ณผ ์ธ๋ฑ์ค๋ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉํ๊ฒ ๋ค
- ์ธ๋ฑ์ค์ ์ญํ ๋ณ ๊ตฌ๋ถ
- Primary Key : ๊ทธ ๋ ์ฝ๋๋ฅผ ๋ํํ๋ ์นผ๋ผ์ ๊ฐ์ผ๋ก ๋ง๋ค์ด์ง ์ธ๋ฑ์ค (ํ ์ด๋ธ์์ ๋ ์ฝ๋๋ฅผ ์๋ณํ๋ ๊ธฐ์ค๊ฐ - ์๋ณ์)
- Secondary Key : ํ๋ผ์ด๋จธ๋ฆฌํค๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ ์ธ๋ฑ์ค
B-Tree ์ธ๋ฑ์ค
B-Tree ์ธ๋ฑ์ค์ ๊ตฌ์กฐ ๋ฐ ํน์ฑ
- ์ต์์ ํ๋์ ๋ฃจํธ๋ ธ๋์ ํ์์ ์์ ๋ ธ๋๊ฐ ๋ถ์ด์์
- ๊ฐ์ฅ ํ์์ ๋ ธ๋๋ฅผ ๋ฆฌํ๋ ธ๋๋ผ๊ณ ํ๋ฉฐ, ์ค๊ฐ์ ์์ผ๋ฉด ๋ธ๋์น ๋ ธ๋๋ผ๊ณ ํจ
- ๋ฆฌํ๋ ธํธ๋๋ ์ค์ ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์ฐพ์๊ฐ๊ธฐ ์ํ ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์์
๋ ์ฝ๋๋ ๋น์ฐํ ์ ๋ ฌ๋ผ ์์ง ์๊ณ , insert๋ ์์๋ก ์ ์ฅ๋์ด์์ง๋ ์๋ค.
- ์ฐธ๊ณ ๋ก MySQL, InnoDB์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ๋ฆฌํ๋ ธ๋๋ ๋ ์ฝ๋ ์ฃผ์๋ฅผ ํ๋ผ์ด๋จธ๋ฆฌํค๋ก ๋ ผ๋ฆฌ์ ์ฃผ์๋ก ์ฐ๊ณ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก PK์ bํธ๋ฆฌ๋ฅผ ๋ค์ ํ์ผ ์ค์ ๋ ์ฝ๋ ์ฃผ์๋ฅผ ์ ์ ์๋ค.
B-Tree ์ธ๋ฑ์ค ํค ์ถ๊ฐ ๋ฐ ์ญ์
์ธ๋ฑ์ค ํค ์ถ๊ฐ
- ์๋ก์ด ํค ๊ฐ์ด B-Tree์ ์ ์ฅ๋ ๋, ํ ์ด๋ธ์ ์คํ ๋ฆฌ์ง ์์ง์ ๋ฐ๋ผ ์๋ก์ด ํค ๊ฐ์ด ์ฆ์ ์ธ๋ฑ์ค์ ์ ์ฅ๋ ์ ๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ํค๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ ์ ํ ์์น๋ฅผ ํ์ํ๊ณ , ํด๋น์์น์ ๋ฆฌํ๋ ธ๋์ ๋ ์ฝ๋ ํค๊ฐ๊ณผ, ์ฃผ์์ ๋ณด๋ฅผ ๋ฆฌํ๋ ธ๋์ ์ ์ฅํด์ผํ๋ค.
- ๋ฆฌํ๋ ธ๋๊ฐ ๊ฝ์ฐจ๋ฉด split์ด ์ผ์ด๋์ผํ๋๋ฐ, ์ด split์ ๋ธ๋์น๋ ธ๋์๋ ์ํฅ์ ๋ฏธ์น ์ ์์ด ๋ณต์กํ ์์ ์ด๋ค.
- ์ธ๋ฑ์ค์ ์ถ๊ฐ๋ก ์ธํด Insert, Update์ ๊ฐ ์ํฅ์ ๋๋ต์ ์ผ๋ก ๊ณ์ฐํ๋๋ฒ
- ๊ธฐ๋ณธ ๋น์ฉ์ 1์ด๋ผ ๊ฐ์
- ์ธ๋ฑ์ค์ ํค๋ฅผ ์ถ๊ฐํ๋ ์์ ๋น์ฉ์ 1.5๋ผ ๊ฐ์
- ์๋ฅผ๋ค์ด 3๊ฐ์ธ๊ฒฝ์ฐ (1.5 * 3 + 1) 5.5๊ฐ ์์
- ์ด๊ฑด ์ธ๋ฑ์ค๋ง๋ค ์ธ๋ฑ์คํ์ด์ง๋ฅผ ์ฝ๊ณ ์จ์ผํด์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด๋ค.
- InnoDB๋ ์ฐธ๊ณ ๋ก ํค์ถ๊ฐ์ ์ฝ๊ฐ์ ์ต์ ํ๊ฐ ๋์ด์๋ค.
- ๋ง์ฝ Unique๊ฐ ์๋๋ฉด ํ์ํ ๊ฒฝ์ฐ ์ง์ฐ์ํด
์ธ๋ฑ์ค ํค ์ญ์
- ์ญ์ ๋ ๊ฐ๋จํ๋ค, ๊ทธ๋ฅ ๋ฆฌํ๋ ธ๋๋ฅผ ์ฐพ์์ ์ญ์ ๋งํฌ๋ง ํ๋ฉด ์๋ฃ๋๋ค.(์ถํ ์ฌํ์ฉํ๊ฑฐ๋ ์ญ์ ๊ฐ๋ฅ)
- ๋ฌผ๋ก ์คํ๋ฆฟ๊ฐ์ ๋ถ๋ถ์์ ์ ์ฐจ์ ์ผ๋ก ๊ฐ๋จํ ๊ฒ์ด์ง disk i/o๋ ๋ฐ์ํ๋ค.
์ธ๋ฑ์ค ํค ๋ณ๊ฒฝ
- ๋ถํ๊ฐ ๊ฐ์ฅ ์ฌํจ, ์ญ์ ๋ฅผ ํ๊ณ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.
์ธ๋ฑ์ค ํค ๊ฒ์
- ํธ๋ฆฌํ์, log n ๋ณต์ก๋, ์์ ๊ฒ๋ค์ ๊ฐ์ํ๋งํผ ๋น ๋ฅธ ์ฑ๋ฅ
- 100ํผ์ผํธ ์ผ์น, ํน์ ๊ฐ์ ์๋ถ๋ถ๋ง ์ผ์นํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ (
like test%) - ๋ถ๋ฑํธ ๋น๊ต ์กฐ๊ฑด์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉ ํ ์ ์์ง๋ง, ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ํค ๊ฐ์ ๋ท๋ถ๋ถ๋ง ๊ฒ์ํ๋ ์ฉ๋๋ก๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
- ์ธ๋ฑ์ค ํค๊ฐ์ ๋ณํ์ด ๊ฐํด์ง ํ ๋น๊ต๋๋๊ฒฝ์ฐ์๋ B-Tree์ ๋น ๋ฅธ ๊ฒ์๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ค.
SELECT * FROM users WHERE LOWER(email) = 'test@example.com';
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ธ๋ฑ์ค๋ ๋ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ค. InnoDB ํ ์ด๋ธ์์ ์ง์ํ๋ ๋ ์ฝ๋ ์ ๊ธ์ด๋, ๋ฅ์คํธ ํค๋ฝ์ด ๊ฒ์์ ์ํํ ์ธ๋ฑ์ค๋ฅผ ์ ๊ทผ ํ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์ ๊ทธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ๋ฐ๋ผ์ UPDATE, DELETE๋ฌธ์ฅ์ด ์คํ ๋ ๋ ํ ์ด๋ธ์ ์ ์ ํ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋ถํ์ํ๊ฒ ๋ง์ ๋ ์ฝ๋๋ฅผ ์ ๊ทผ๋ค.
B-Tree ์ธ๋ฑ์ค ์ฌ์ฉ์ ์ํฅ์ ๋ฏธ์น๋ ์์
์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์นผ๋ผ์ ํฌ๊ธฐ์ ๋ ์ฝ๋์ ๊ฑด์, ๊ทธ๋ฆฌ๊ณ ์ ๋ํฌํ ์ธ๋ฑ์ค ํค ๊ฐ์ ๊ฐ์๋ฑ์ ์ํด ๊ฒ์์ด๋ ๋ณ๊ฒฝ ์์ ์ ์ฑ๋ฅ์ด ์ํฅ์ ๋ฐ๋๋ค.
์ธ๋ฑ์ค ํค ๊ฐ์ ํฌ๊ธฐ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ ๋จ์๋ฅผ ํ์ด์ง ๋๋ ๋ธ๋ก์ด๋ผ๊ณ ํ๋ฉฐ, ๋์คํฌ์ ๋ชจ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ์ต์ ์์ ๋จ์๊ฐ ๋๋ค. ๋ํ ํ์ด์ง๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ฒํผ ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋งํ๋ ๊ธฐ๋ณธ ๋จ์์ด๊ธฐ๋ ํ๋ค. ์ธ๋ฑ์ค๋ ๊ฒฐ๊ตญ์ ํ์ด์ง ๋จ์๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ฃจํธ์ ๋ธ๋์น ๋ฆฌํ๋ฅผ ๊ตฌ๋ถํ ๊ธฐ์ค์ด ๋ฐ๋ก ํ์ด์ง ๋จ์์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก innoDB์ ํ์ด์ง ์์ง ๋จ์๋ 16kb (์ค์ ๊ฐ๋ฅ)
- ์ธ๋ฑ์ค ํค๊ฐ 16byte, ์์๋ ธ๋์ ์ฃผ์๊ฐ ๋๋ ฅ์ ์ผ๋ก 12byte๋ผ๊ณ ๊ฐ์ ํ์๋ ํ๋์ ์ธ๋ฑ์ค ํ์ด์ง(16kb)์ 585๊ฐ ์ ๋์ ํค๋ฅผ ์ ์ฅํ ์ ์๋ค.
- ๋ฌธ์ ๋ ์ธ๋ฑ์ค ํค๊ฐ์ด ์ปค์ง๋ฉด ํ์ด์ง์ ์ ์ฅ๋๋ ์ธ๋ฑ์ค๊ฐ ์ค์ด๋ค๊ฒ์ด๊ณ , ๊ทธ ์ค์ด๋ ๊ฒ ์ฑ๋ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ค.
- ์๋ฅผ๋ค์ด 500๊ฐ์ ๋ฒ์๋ฅผ ๊ธ์ด์ค๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ๋๋ฐ,
- ํค๊ฐ ์ปค์ ธ์ ํ์ด์ง๋น 300๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ณด๊ดํ๋ค๋ฉด,
- ์ต์ ๋๋ฒ์ disc I/O๊ฐ ๋ฐ์
- ์ถ๊ฐ์ ์ผ๋ก ์ธ๋ฑ์ค ํค๊ฐ์ด ์ปค์ง๋ฉด, ์ธ๋ฑ์ค ์์ฒด์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋๊ฒ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด๋ ์ ์๋ ๋ ์ฝ๋์๋ ๊ฐ์ํ๋ค.
B-Tree์ ๊น์ด
- ํค๊ฐ์ด ๋์ด๋์ ํ์ด์ง๋น ํค๊ฐ์ด ์ค์ด๋ค๋ฉด ๊น์ด๋ ๋์ด๋๋ ๋ค.
- ์ฌ์ค ํฐ ๋ฌธ์ ๊ฐ ๋๋๊ฑด ์๋๊ณ ์ธ๋ฑ์ค ํค๊ฐ์ ์ค์ด๋๊ฒ ๋ซ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ํ๊ธฐ์ํด์ ๊ฐ์กฐํ๋ค๊ณ ํ๋ค.
Selectivity(Cardinality)
- ๊ฑฐ์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ฉฐ ๋ชจ๋ ์ธ๋ฑ์ค ํค๊ฐ๊ฐ์ด๋ฐ ์ ๋ํฌํ ๊ฐ์ ์๋ฅผ ์๋ฏธ
- ์ ์ฒด ์ธ๋ฑ์ค ํค๊ฐ์ด 100๊ฐ์ธ๋ฐ 10๊ฐ๊ฐ ์ ๋ํฌํ๋ค๋ฉด selectivity ๋ 10
- ์ ํ๋๊ฐ ๋์์๋ก ๊ฒ์ ๋์์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ๊ทธ๋งํผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋ค.
- ๋ฌผ๋ก ์ ๋ ฌ์ด๋ ๊ทธ๋ฃจํ๊ณผ ๊ฐ์ ์์ ์ ์ํด ์ข์ง์์ ์ ํ๋๋ผ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฃ๋๊ฒฝ์ฐ๋ ๋ง๋ค.
-- country, city์นผ๋ผ์ด ์์ผ๋ฉฐ, ์ ์ฒด ๋ ์ฝ๋๋ 1๋ง๊ฑด, countryํ
์ด๋ธ๋ง ์ธ๋ฑ์ค๊ฐ ์์ ๋
-- ์ผ์ด์ค A: country ์นผ๋ผ์ ์ ๋ํฌํ ๊ฐ์ ๊ฐ์๊ฐ 10๊ฐ
-- ์ผ์ด์ค b: country ์นผ๋ผ์ ์ ๋ํฌํ ๊ฐ์ ๊ฐ์๊ฐ 1000๊ฐ
select *
from tb_test
where country='KOREA' and city='SEOUL';
-- ๋ง์ฝ ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๊ฐ ๋จ ํ ๊ฑด์ด๋ผ๋ฉด?
- ์์ ์์์์, a์๊ฒฝ์ฐ ํ๊ท ์ ์ผ๋ก 1000๊ฑด์ ์กฐํํ๊ฒ๋๊ณ , b์ ๊ฒฝ์ฐ ํ๊ท ์ ์ผ๋ก 10๊ฑด์ ์กฐํํ๊ฒ ๋๋ค.
์ฝ์ด์ผ ํ๋ ๋ ์ฝ๋์ ๊ฑด์
์ธ๋ฑ์ค๋ฅผ ํตํด ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์ฝ๋๊ฒ๋ณด๋ค ๋์ ๋น์ฉ์ด ๋๋ ์์ ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก๋ ๋ ์ฝ๋ ํ๊ฑด์ ๊ทธ๋ฅ์ฝ๋ ๊ฒ ๋๋น ์ธ๋ฑ์ค๋ฅผ ํ๊ณ ์ฝ๋๊ฒ 4~5๋ฐฐ ์ ๋ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค๊ณ ์ธ๊ธ๋๋ค.
- ์ฆ ๋ง์ฝ ํ ์ด๋ธ์ 20~25%๊ฐ ์กฐํ๋์์ธ๊ฒฝ์ฐ, ์ ์ฒด๋ฅผ ์ฝ๊ณ ํ์ํ ๋ ์ฝ๋๋ง ๊ฐ๋ ค๋ด๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋๊ฒ์ด ํจ์จ์ ์ด๋ค.
- ์ด๋ฐ ๊ณ์ฐ์ ์ตํฐ๋ง์ด์ ๊ฐ ํด์ฃผ๊ธด ํ์ง๋ง, ์๊ณ ์์ด์ผ ํ๋ค.
- ์๋ฅผ๋ค์ด ์ค์ ์กฐํ๋๋ง๋ค ํ ์ด๋ธ์ 30ํผ์ผํธ ๋จ์ง์ ํผ๊ฐ์ผ ํ๋๋ฐ ๊ทธ๊ฒ ‘๋๋ฌธ์’ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋์ง์ ํ์ง ๋ง์์ผํ๋ค.
B-Tree ์ธ๋ฑ์ค๋ฅผ ํตํ ๋ฐ์ดํฐ ์ฝ๊ธฐ
์ด๋ ํ ๊ฒฝ์ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ฒ ์ ๋ํ ์ง, ๋ฐ๋๋ก ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ ์ง ํ๋จํ๋ ค๋ฉด MySQL๋ ์ ํํ๊ฒ๋ ์คํ ๋ฆฌ์ง์์ง์ด ์ด๋ป๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์ค์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด๋ด๋์ง ์์์ผ ํ๋ค.
์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ
- ๊ฐ์ฅ ๋ํ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๊ณ , ๋ค์ ์ค๋ช ํ ๋๋จธ์ง ๋๊ฐ์ง ์ ๊ทผ ๋ฐฉ์๋ณด๋ค๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ.
- ๊ฒ์ํด์ผํ ์ธ๋ฑ์ค์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋์๋ ์ฌ์ฉํ๋ ๋ฐฉ์
- ์ฒ์์๋ ๋ฆฌํ๋ ธ๋๊น์ง ๊ฐ์ ์ฐพ๊ณ , ์์ฐจ์ ์ผ๋ก ์ฝ์ด์ ๊ธ์ด์จ๋ค(์ค์บ)
- ๋ณดํต ๋ฆฌํ๋ ธ๋์์ ๋ ์ฝ๋(์ ์ฃผ์๋) ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋์ด์์ด ๋ค์ ๋ ธ๋๋ ๋ฐ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- ์ด๋ค ๋ฐฉ์์ผ๋ก ์ค์บํ๋ ๊ด๊ณ์์ด, ํด๋น ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์นผ๋ผ์ ์ ์ ๋๋ ์ญ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ๊ฐ์ ธ์จ๋ค.
- ๋ณ๋์ ์ ๋ ฌ๊ณผ์ ์ด ์๋ฐ๋๋๊ฒ์ด์๋๋ผ ์ธ๋ฑ์ค ์์ฒด์ ์ ๋ ฌ ํน์ฑ๋๋ฌธ์ ๊ทธ๋ฐ๊ฒ
- ์ธ๋ฑ์ค์ ๋ฆฌํ๋ ธ๋์์ ๊ฒ์์กฐ๊ฑด์ ์ผ์นํ๋ ๊ฑด๋ค์ ๋ฐ์ดํฐํ์ผ์์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๋ ๊ณผ์ ์ด ํ์ํ๋ค.
- ์ด ๋ ๋ฆฌํ๋ ธ๋์ ์ ์ฅ๋ ๋ ์ฝ๋ ์ฃผ์๋ก ๋ฐ์ดํฐํ์ผ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๋๋ฐ ๋ ์ฝ๋ ํ๊ฑด ํ๊ฑด ๋จ์๋ก ๋๋ค I/O๊ฐ ํ๋ฒ ์ฉ ์ผ์ด๋๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก
- Index seek : ์ธ๋ฑ์ค์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์ฐพ๋๋ค.
- Index sacn : ํ์๋ ์์น๋ถํฐ ํ์ํ ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ญ์ฝ๋๋ค.
- Index scan์ ๊ฒฐ๊ณผ๋ก ์ฝ์ด๋ค์ธ ํค์ ๋ ์ฝ๋ ์ฃผ์๋ฅผ ์ด์ฉํด ๋ ์ฝ๋๊ฐ ์ ์ฅ๋ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ต์ข ๋ ์ฝ๋๋ฅผ ์ฝ์ด์จ๋ค.
- ์์ 3๋ฒ์ ๊ณผ์ ์ด ํ์์๋ ๊ฒฝ์ฐ(์ฆ ์ธ๋ฑ์ค ๋ด์ ์ฒ๋ฆฌ์์๋ง์ผ๋ก ์กฐํ ๋์์ด ๋๋๋ ๊ฒฝ์ฐ)๋ฅผ Covering Index๋ผ๊ณ ํ๋๋ฐ ์ฑ๋ฅ์ด ์ข๋ค.
show status like 'Handler%';
| ๋ณ์๋ช | ๊ฐ ย ย | ์ค๋ช |
|---|---|---|
| Handler_commitย ย ย ย | 120 ย | ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ํ์ |
| Handler_deleteย ย ย ย | 35ย ย | ํ ์ด๋ธ์์ ํ์ด ์ญ์ ๋ ํ์ |
| Handler_discoverย ย ย | 0 ย ย | NDB Cluster์์ ์๋์ผ๋ก ํ ์ด๋ธ์ ๋ฐ๊ฒฌํ ํ์ |
| Handler_external_lock | 500 ย | ํ ์ด๋ธ ์ ๊ธ์ ํ๋ํ ํ์ |
| Handler_mrr_initย ย ย | 0 ย ย | ๋ค์ค ๋ฒ์ ์ฝ๊ธฐ(MRR)๊ฐ ์ด๊ธฐํ๋ ํ์ |
| Handler_prepare ย ย ย | 60ย ย | ํธ๋์ญ์ ์ด ์ค๋น๋ ํ์ (2PC์์ ์ฌ์ฉ) |
| Handler_read_firstย ย | 5 ย ย | ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ํ์ ์ฝ์ ํ์ |
| Handler_read_keyย ย ย | 300 ย | ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ฐพ์ ํ์ |
| Handler_read_next ย ย | 450 ย | ์ธ๋ฑ์ค ์ค์บ์์ ๋ค์ ํ์ ์ฝ์ ํ์ |
| Handler_read_prev ย ย | 20ย ย | ์ธ๋ฑ์ค ์ค์บ์์ ์ด์ ํ์ ์ฝ์ ํ์ |
| Handler_read_rndย ย ย | 15ย ย | ํน์ ์์น์์ ํ์ ์ฝ์ ํ์ |
| Handler_read_rnd_next | 700 ย | ์ ์ฒด ํ ์ด๋ธ ์ค์บ์์ ๋ค์ ํ์ ์ฝ์ ํ์ |
| Handler_rollbackย ย ย | 10ย ย | ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ ํ์ |
| Handler_updateย ย ย ย | 80ย ย | ํ์ด ์ ๋ฐ์ดํธ๋ ํ์ |
| Handler_write | 200 ย | ์๋ก์ด ํ์ด ์ฝ์ ๋ ํ์ |
-
Handler_read_keyย ย โ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ์ ย ย ๊ฐ์ด ๋๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ๊ณ ์๋ ๊ฒ ย ๊ฐ์ด ๋ฎ๋ค๋ฉด ํ ์ด๋ธ ์ค์บ์ด ๋ฐ์ํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ์์. -
Handler_read_rnd_nextย ย โ ์ ์ฒด ํ ์ด๋ธ ์ค์บ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ์ ย ย ๊ฐ์ด ๋๋ค๋ฉด ์ธ๋ฑ์ค ์์ด ์ ์ฒด ํ ์ด๋ธ์ ๋ฐ๋ณต ํ์ํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์. ย ย ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ต์ ํํ ํ์๊ฐ ์์. -
Handler_read_firstย ย โ ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ํ์ ์ฝ์ ํ์ ย ยORDER BY๋๋GROUP BY์ฟผ๋ฆฌ์์ ์ฃผ๋ก ๋ฐ์. -
Handler_read_next/Handler_read_prevย ย โ ์ธ๋ฑ์ค ๋ฒ์ ์ค์บ์ด ์ผ๋ง๋ ์ผ์ด๋๋์ง ์ธก์ ย ยHandler_read_next๊ฐ์ด ๋๋ค๋ฉด, ์ธ๋ฑ์ค ๋ฒ์ ๊ฒ์์ด ํ๋ฐํ๊ฒ ์ด๋ฃจ์ด์ง๊ณ ์๋ ๊ฒ. -
Handler_read_rndย ย โ ๋๋คํ๊ฒ ํน์ ์์น์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ์ ย ย ๊ฐ์ด ๋๋ค๋ฉด ํ์ผ ์ ๋ ฌ(File Sort) ์ด ์์ฃผ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์. -
Handler_commit&Handler_rollbackย ย โ ํธ๋์ญ์ ์ด ์ผ๋ง๋ ์์ฃผ ์ปค๋ฐ๋๊ณ ๋กค๋ฐฑ๋๋์ง ย ย ํธ๋์ญ์ ์ด ๋๋ฌด ์ฆ์ผ๋ฉด ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์์.
์ธ๋ฑ์ค ํ ์ค์บ
- ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ ์ธ์ง์ค์บ๊ณผ๋ ๋ฌ๋ฆฌ ์ธ๋ฑ์ค์ ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ์ฝ๋ ๋ฐฉ์
- ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ ์ฌ์ฉ๋ ์นผ๋ผ์ด ์ธ๋ฑ์ค์ ์ฒซ๋ฒ์งธ ์นผ๋ผ์ด ์๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ํ์ค์บ ๋ฐ์์ด ์ฌ์ฉ๋๋ค.
- ์ฆ ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค์ ๋ช ์๋ ์นผ๋ผ๋ง์ผ๋ก ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ์ ์๋๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋๋ค.
๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ
- ์ง๊ณ ์ฟผ๋ฆฌ์์ ํ์์๋๊ฐ ๋๊ธฐ๋ ์ธ๋ฑ์ค
- a, b ์นผ๋ผ ๋ณตํฉ์ธ๋ฑ์ค์ธ๋ฐ, b๊ฐ ์ ๋ ฌ๋์ด์์ผ๋ฉด
- a๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฑด๋๋ฐ๋ฉด์ ์ฒซ์ค์ b๊ฐ๋ง ๊ฐ์ ธ์์ ์ฒ๋ฆฌํ๋ฉด๋๋ค.
์ธ๋ฑ์ค ์คํต ์ค์บ
- ์ธ๋ฑ์ค๋ฅผ ์คํตํ ๊ฒ์ฒ๋ผ ์ต์ ํ ํด์ฃผ๋๊ฒ
- ๋ณตํฉ์ธ๋ฑ์ค์์, ์ธ๋ฑ์ค๊ฐ ์๋ ์ ํ์นผ๋ผ์ ์ ๋ํฌ๊ฐ๋ค์ ๋ค ๋ฝ์์ ์ฌ๋ฌ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋๊ฒ๊ณผ ๋น์ทํ ํํ์ ์ต์ ํ
- MySQL์์๋ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค์ธ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
๋ค์ค ์นผ๋ผ ์ธ๋ฑ์ค
- ๋ณต์์ ํค
- ์ผ์ชฝ๋ถํฐ ์ ๋ ฌ
- ์นผ๋ผ์ ์์น๋ฅผ ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ผํจ
B-Tree ์ธ๋ฑ์ค์ ์ ๋ ฌ ๋ฐ ์ค์บ ๋ฐฉํฅ
- ํญ์ ์ค๋ฆ์ฐจ์์ด๊ฑฐ๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋จ
- ์ตํฐ๋ง์ด์ ๊ฐ ์ค์๊ฐ์ผ๋ก ์ ๋ฆฌํด์ ์คํ๊ณํ ์๋ฆฝ
์ธ๋ฑ์ค์ ์ ๋ ฌ
์ค์ ํ ๋ ๊ฐ๋ฅ 8.0 ์ด์
create index ix_teamname_userscore on employees (team_name asc, user_score desc)
์ค์บ ๋ฐฉํฅ
- ์ตํฐ๋ง์ด์ ๊ฐ ์์์ ์ ์ ํ
B-Tree ์ธ๋ฑ์ค์ ๊ฐ์ฉ์ฑ๊ณผ ํจ์จ์ฑ
select * from dept_emp
where dept_no='d002' and emp_no >= 10114
;
์ผ์ด์ค a: index(dept_no, emp_no)
์ผ์ด์ค b: index(emp_no, dept_no)
- ์ผ์ด์ค a : “dept_no = ‘d002’ and emp_no >= 10114” ์ธ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ณ , d002๊ฐ ์๋๋๊น์ง ์ญ ์ฝ๊ธฐ๋ง ํ๋ฉด ๋จ - ํจ์จ์
- ์ผ์ด์ค b : “dept_no = ‘d002’ and emp_no >= 10114” ์ธ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ณ , ๊ทธ ์ดํ ๋ชจ๋ ๋ ์ฝ๋๊ฐ d002์ธ์ง ๋น๊ตํด์ผํ๋ค.
- case a ์์๋ ๋์กฐ๊ฑด์ด ์์ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋๋ก ๋์ํ๋ค.
- case b ์๋ dept_no๊ฐ ํํฐ๋ง์ญํ ๋ง ํ๋ค.
๊ฐ์ ์ค๋ ๋ ์ฝ๋๋ ์ค์๊ธฐ๋๋ฌธ์ ์ด๊ฒ์ ์ฟผ๋ฆฌ์ ๋น์ฉ์ด ์ค์๋ค๊ณ ์ฐฉ๊ฐํ๊ธฐ ์ฌ์์ ๋์จ ์์ ๊ฐ๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก๋ ์กฐ๊ฑด์ ์์ ์ฃผ๋ ์กฐ๊ฑด๋ค์ด ์์ ๋ฒ์๋ฅผ ์ ํํด์ค์ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋์ด๋์ง, ๊ทธ๊ฒ์๋๋ฉด ํํฐ๋ง์ญํ ๋ง ํ๋์ง ์ ๊ตฌ๋ถํด์ผํ๋ค๋๊ฒ.
์ธ๋ฑ์ค์ ๊ฐ์ฉ์ฑ
- ํญ์ ์ผ์ชฝ ๋ฒ์ ์ ๋ ฌ์ ์ผ๋์ ๋ฌ์ผํ๋ค.
%likevslike%: ํ์๋ง ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ด์ฉํ๋ค.- ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ด์ค a์์ ๋ง์ฝ ๊ทธ๋ฅ dept_no๋ฅผ ์์คฌ๋ค๋ฉด ์ง์ ์ ์์์ ๋๊ฐ๋ค.
๊ฐ์ฉ์ฑ๊ณผ ํจ์จ์ฑ ํ๋จ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ ์กฐ๊ฑด์์๋ ์์
๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค
NOT-EQUAL๋ก ๋น๊ต๋ ๊ฒฝ์ฐ<>,not in,is not nulllike์์ %- ์คํ ์ด๋ ํจ์๋ ๋ค๋ฅธ ์ฐ์ฐ์๋ก ์ธ๋ฑ์ค ์นผ๋ผ์ด ๋ณํ๋ ํ ๋น๊ต๋ ๊ฒฝ์ฐ
- ๋น๊ฒฐ์ ์ ํจ์๊ฐ ๋น๊ต์กฐ๊ฑด์ ์ฌ์ฉ๋๊ฒฝ์ฐ
- ๋ฐ์ดํฐํ์ ์ด ์๋ก ๋ค๋ฅธ ๋น๊ต
- ๋ฌธ์์ด ๋ฐ์ดํฐ ํ์ ์ ์ฝ๋ ์ด์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค
- pk๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ๊น์ด ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ฌ์ค ์ธ๋ฑ์ค ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ธฐ๋ณด๋ค ํ ์ด๋ธ ๋ ์ฝ๋์ ์ ์ฅ๋ฐฉ์์
- ๋ ์ฝ๋ ์ ์ฅ์ด๋ ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ๋ณ๊ฒฝ์ด ์๋์ ์ผ๋ก ๋๋ฆผ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ฉฐ, ๊ทธ๋์ pk๊ฐ ์์ด๋ ๊ธฐ์ค์๋ฐ๋ผ ํด๋ฌ์คํฐ๋ง ํค๋ฅผ ์ ํจ
- ๊ทธ๋์ ํ๋ผ์ด๋จธ๋ฆฌํค๋ฅผ ๋ ผ๋ฆฌ์ ์ฃผ์๋ก ์ฌ์ฉํ๋๊ฒ
- ์๋ํ๋ฉด ํ๋ผ์ด๋จธ๋ฆฌํค์ ๋ณ๊ฒฝ์ด ์์๋๋ง๋ค ์ค์ ๋ ์ฝ๋ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ์ธ๋ฑ์ค์ ๋ฌผ๋ฆฌ์ ์ฃผ์๋ฅผ ๋ฐ๊ฟ์ค์ผ ํ๊ธฐ ๋๋ฌธ์
- ๊ทธ๋์ ์ปค๋ฒ๋ง์ธ๋ฑ์ค๋ฅผ ์กฐ๊ธ ๋ ์ ํ์ฉํด์ผํจ
- ๋ง์ง๋ง์ผ๋ก ์ฅ๋จ์ ์์ฝ์ ์ฝ๊ธฐ์์ ๊ฑฐ์ ๋์ ๋ณด์ง๋ง ์ฐ๊ธฐ์์ ์ค์ด ์๋ ๊ตฌ์กฐ๋ผ ์จ๋ผ์ธ์๋น์ค์ ๋ ์ ํฉ
- ์ ์ง์ง ๋ง์ง๋ง์ผ๋ก, ๊ทธ๋์ snowflake๊ฐ์๊ฑธ ์จ์ฃผ๋ฉด ์ข์ (snowflake์ ์์ฑ์๊ฐ ๊ธฐ๋ฐ unique)
| ๊ตฌ๋ถ | ์ฅ์ | ๋จ์ | ์ ์ํ ์ |
|---|---|---|---|
| ์คํ ๋ฆฌ์ง ๊ตฌ์กฐ | ๋ฐ์ดํฐ๊ฐ ํ๋ผ์ด๋จธ๋ฆฌ ํค ์์ ๋ก ์ ๋ ฌ๋์ด ์์ด ๋ฒ์ ์กฐํ(RANGE SCAN)๊ฐ ๋น ๋ฆ | PK๊ฐ ๋๋คํ ๊ฐ(UUID ๋ฑ)์ผ ๊ฒฝ์ฐ, ํ์ด์ง ๋ถํ (Page Split) ์ด ์์ฃผ ๋ฐ์ํ์ฌ ์ฑ๋ฅ ์ ํ | ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ฅผ AUTO_INCREMENT๋ก ์ค์ ํ๋ฉด ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ |
| ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค | ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๊ฐ PK๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ธ๋ฑ์ค ๋ฃจํ ์กฐ์ธ(INDEX NESTED LOOP JOIN) ์ต์ ํ ๊ฐ๋ฅ | ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ํฌ๊ธฐ๊ฐ ์ปค์ง (PK๊ฐ ๊ธธ๋ฉด ๋ชจ๋ ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ์ฆ๊ฐ) | ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ฅผ ์งง๊ณ ์ ์ ํ์ ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ ๋ฆฌ |
| SELECT ์ฑ๋ฅ | PK ๊ธฐ๋ฐ ์กฐํ๊ฐ ๋งค์ฐ ๋น ๋ฆ (B+Tree ๊ตฌ์กฐ์ ์ด์ ) |
์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค ์กฐํ ์ PK๋ฅผ ์ถ๊ฐ ์กฐํํด์ผ ํ๋ฏ๋ก (์ธ๋ฑ์ค -> PK ์กฐํ) ์๋๊ฐ ๋ค์ ๋๋ ค์ง | ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ๋๋ฌด ๋ง์ด ๋ง๋ค๋ฉด ์ค๋ฒํค๋ ๋ฐ์ |
| INSERT ์ฑ๋ฅ | PK ์์๋๋ก ์ฝ์ ํ๋ฉด ์ฑ๋ฅ์ด ์ข์ (INSERT ์ ์ ๋ ฌ ๋ถ๋ด ์ ์) | PK ๊ฐ์ด ๋๋คํ๋ฉด Page Split ๋ฐ์์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ | ๋๋คํ PK(UUID)๋ณด๋ค AUTO_INCREMENT๊ฐ ์ฑ๋ฅ์ ์ ๋ฆฌ |
| UPDATE ์ฑ๋ฅ | ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ ๋ถ๋ณ(Immutable)์ผ๋ก ์ค๊ณํ๋ฉด ์ฑ๋ฅ์ด ์ข์ | PK๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋น ๋ ์ฝ๋๊ฐ ์ญ์ ํ ์ฌ์ฝ์ ๋จ (์ฆ, ๋น์ฉ์ด ๋งค์ฐ ํผ) | PK๋ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ค์ |
| DELETE ์ฑ๋ฅ | PK ๊ธฐ๋ฐ ์ญ์ ๋ ๋น ๋ฆ (B+Tree ๊ตฌ์กฐ ํ์ฉ) | ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๊ฐ ๋ง์ผ๋ฉด ์ญ์ ์๋ง๋ค ์ ๋ฆฌ ๋น์ฉ(๋ฆฌํ ๋ ธ๋ ์ญ์ )์ด ํผ | ๋ถํ์ํ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ์ข์ |
์ ๋ํฌ ์ธ๋ฑ์ค
๋ ์ฑ๋ฅ์ด ์ข์ง๋ ์๋ค, ์ฐ๊ธฐ์ฑ๋ฅ์ ์ด๋ฒํ๊ณ
์ธ๋ํค
๋ถ๋ชจ ํ ์ด๋ธ(PK ํ ์ด๋ธ) ๋ณ๊ฒฝ ์
- INSERT: ์์ ํ ์ด๋ธ์์ ์ฐธ์กฐํ๋ PK๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ถ๋ชจ ํ ์ด๋ธ์ ํด๋น PK์ ๋ํด S(๊ณต์ ) ๋ฝ์ด ๊ฑธ๋ฆผ.
- UPDATE: ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค(PK)๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด, ์์ ํ ์ด๋ธ์ด ์ด๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ X(๋ฐฐํ์ ) ๋ฝ์ด ๋ฐ์ํจ.
- DELETE: ๋ถ๋ชจ ํ ์ด๋ธ์ PK๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์์ ํ ์ด๋ธ์ FK๊ฐ ์ด๋ฅผ ์ฐธ์กฐํ๋์ง ํ์ธํด์ผ ํ๋ฏ๋ก X(๋ฐฐํ์ ) ๋ฝ์ด ๋ฐ์.
์์ ํ ์ด๋ธ(FK ํ ์ด๋ธ) ๋ณ๊ฒฝ ์
- INSERT: ๋ถ๋ชจ ํ ์ด๋ธ์ ์กด์ฌํ๋ PK๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก, ๋ถ๋ชจ ํ ์ด๋ธ์์ ํด๋น PK์ ๋ํด S(๊ณต์ ) ๋ฝ์ด ๋ฐ์.
- UPDATE: ์์ ํ ์ด๋ธ์ FK ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, ๊ธฐ์กด ๋ฐ ์๋ก์ด FK ๊ฐ์ด ๋ถ๋ชจ ํ ์ด๋ธ์ ์กด์ฌํ๋์ง ํ์ธํด์ผ ํ๋ฏ๋ก ๋ถ๋ชจ ํ ์ด๋ธ์ S(๊ณต์ ) ๋ฝ์ด ๋ฐ์.
- DELETE: ์์ ํ ์ด๋ธ์ ํ์ ์ญ์ ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฝ์ ์ ๋ฐํ์ง ์์ง๋ง, ON DELETE CASCADE ์ค์ ์ด ๋์ด ์๋ค๋ฉด ๋ถ๋ชจ ํ ์ด๋ธ์๋ X(๋ฐฐํ์ ) ๋ฝ์ด ๋ฐ์ํ ์ ์์.
์ตํฐ๋ง์ด์ ์ ํํธ
๊ฒฐ๊ณผ๋ ๋์ผํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋ค์ํ๋ค. ์ด๋ฐ ๋ค์ํ ๋ฐฉ๋ฒ์ค์์ ์ด๋ค ๋ฐฉ๋ฒ์ด ์ต์ ์ด๊ณ ์ต์์ ๋น์ฉ์ด ์๋ชจ๋ ์ง ๊ฒฐ์ ํด์ผํ๋ค. (๋์ผํ ๊ฒฐ๊ณผ ๋ค์ํ ๋ฐฉ๋ฒ์ค์์์ ์ต์ ํ๊ฐ ์ตํฐ๋ง์ด์ )
๊ฐ์
์ฟผ๋ฆฌ ์คํ ์ ์ฐจ
- ์ฒซ ๋จ๊ณ : ์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ๋ SQL ๋ฌธ์ฅ์ ์๊ฒ ์ชผ๊ฐ์ MySQL ์๋ฒ๊ฐ ์ดํดํ ์ ์๋ ์์ค์ผ๋ก ๋ถ๋ฆฌ (parse tree) ํ๋ค.
- ๋ฌธ๋ฒ์ ์ผ๋ก ์๋ชป๋์ผ๋ฉด ์ฌ๊ธฐ์ ๊ฑธ๋ฌ์ง
- MySQL ์๋ฒ๋ ํ์คํธ๋ฆฌ๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
- ๋๋ฒ์งธ ๋จ๊ณ : SQL์ ํ์ฑ ์ ๋ณด (ํ์ค ํธ๋ฆฌ)๋ฅผ ํ์ธํ๋ฉด์ ์ด๋ค ํ
์ด๋ธ๋ถํฐ ์ฝ๊ณ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ํ
์ด๋ธ์ ์ฝ์์ง ์ ํํ๋ค.
- ๋ถํ์ํ ์กฐ๊ฑด์ ๊ฑฐํ๊ณ ๊ฐ๋ฅํ๋ค๋ฉด ๋ณต์กํ ์ฐ์ฐ์ ๋จ์ํํ๋ค.
- ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ค ์์๋ก ์ฝ์์ง ๊ฒฐ์ ํ๋ค.
- ๊ฐ ํ ์ด๋ธ์ ์ฌ์ฉ๋ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์ค ํต๊ณ ์ ๋ณด๋ฅผ ์ด์ฉํด ์ฌ์ฉํ ์ธ๋ฑ์ค๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๊ฐ์ ธ์จ ๋ ์ฝ๋๋ค์ ์์ ํ ์ด๋ธ์ ๋ฃ๊ณ ๋ค์ ํ ๋ฒ ๊ฐ๊ณตํด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ค.
- ์ธ๋ฒ์งธ ๋จ๊ณ : ๋ ๋ฒ์งธ ๋จ๊ณ์์ ๊ฒฐ์ ๋ ํ ์ด๋ธ์ ์ฝ๊ธฐ ์์๋ ์ ํ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ตํฐ๋ง์ด์ ์ ์ข ๋ฅ
- CBO (Cost Based Optimizer) : ์ฌ๋ฌ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ง๋ค๊ณ ๊ฐ ๋จ์์์ ์ ๋น์ฉ์ ๋ณด์ ๋์ ํ ์ด๋ธ์ ์์ธก๋ ํต๊ณ ์ ๋ณด๋ฅผ ์ด์ฉํด ์คํ๊ณํ๋ณ ๋น์ฉ์ ์ฐ์ถํ๋ค.
- RBO (Rule Based Optimizer) : ๊ทธ๋ฅ ์ตํฐ๋ง์ด์ ์ ๋ด์ฅ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์คํ ๊ณํ์ ์๋ฆฝํ๋ค. ๋ค๋ง ์์ฆ์ ๊ฑฐ์ CBO๋ฅผ ์ด์ฉํ๋ค. ์ธ๋ฑ์ค๋ ํ ์ด๋ธ์ ํต๊ณ์ ๋ณด๊ฐ ์๊ณ CPU์ฐ์ฐ์ด ๋๋ฆฌ๋ ์์ ์ ์ฌ์ฉํ์์
๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
ํ ํ ์ด๋ธ ์ค์บ๊ณผ ํ ์ธ๋ฑ์ค ์ค์บ
- ํํ ์ด๋ธ ์ค์บ์ ๋ง ๊ทธ๋๋ก ํ ์ด๋ธ์ ํ ์ดํฐ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ฝ์ด์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๊ฒ
- ์ตํฐ๋ง์ด์ ๊ฐ ํํ
์ด๋ธ ์ ํ์ ์ ํํ๋๊ฒฝ์ฐ
- ํ ์ด๋ธ ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋๋ฌด ์์์ ์ธ๋ฑ์ค๋ณด๋ค ํํ ์ด๋ธ์ค์บ์ด ๋น ๋ฅธ๊ฒฝ์ฐ (ํ์ด์ง 1๊ฐ๋ก ๊ตฌ์ฑ๋๊ฒฝ์ฐ)
- where์ ์ด๋ on์ ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ ์ ์ ํ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ
- ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ ์ ์๋ ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋๋ผ๋ ์ตํฐ๋ง์ด์ ๊ฐ ํ๋จํ ์กฐ๊ฑด ์ผ์น ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ (์ธ๋ฑ์ค b-tree๋ฅผ ์ํ๋งํด์ ์กฐ์ฌํ ํต๊ณ์ ๋ณด ๊ธฐ์ค)
- ๋ฆฌ๋ ์ดํค๋(read ahead)๊ฐ ์ผ์ด๋จ
- ํฌ์ด๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ํ์ด์ง๋ฅผ ์ฝ๋ค๊ฐ, ์ฝ๋ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ์๋ํ๋์ผ
- ์ผ๋ฐ์ ์ผ๋ก ๋ํดํธ๋ก ๋ฆฌ๋์ดํค๋ ์ค์ ์ ์ฐ์ง๋ง, ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ฉ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ด ์ต์ ์ ๋ ๋ฎ์ ๊ฐ์ผ๋ก ์ค์ ํด์ ๋ฆฌ๋์ดํค๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ฐํ๋๊ฒ ๋์ ๊ฒฝ์ฐ๋ ์๋ค. (์ ์ด์ ์ํ์ ์ค์บ์ด ๋ง๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๋นจ๋ฆฌ ์ฒ๋ฆฌํด๋๋๊ฒ ๋ซ๊ธฐ ๋๋ฌธ์)
- ํ ์ธ๋ฑ์ค ์ค์บ์ ์ง๊ณ์ฟผ๋ฆฌ๋ฑ์์ ์์ฃผ ์ผ์ด๋จ
- ๋ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ํ์ ์๊ณ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์๋์ ์ผ๋ก ์ ์ด์ ์ ๋ฆฌ
๋ณ๋ ฌ ์ฒ๋ฆฌ
ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋๋ ์ ์ฒ๋ฆฌํ๋ค๋๊ฑธ ์ด์ผ๊ธฐํ๋ค. ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ๊ฐ์ ์ฟผ๋ฆฌ๋ ์๋๋ ๋์๋ค.
set session innodb_parallel_read_threads=1;
set count(*) from salaries;
1 row in set (0.32 sec)
set session innodb_parallel_read_threads=2;
set count(*) from salaries;
1 row in set (0.20 sec)
set session innodb_parallel_read_threads=3;
set count(*) from salaries;
1 row in set (0.13 sec)
Order by ์ฒ๋ฆฌ (Using filesort)
- ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ๋์ ์ ๋ ฌ์ ์งํํ๋๊ฒ
- ๋ ์ฝ๋ ํฌ๊ธฐ์ ๋น๋กํด์ ์ฟผ๋ฆฌ์ ์๋๊ฐ ์ค์ด๋ ๋ค
- ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉ
- ์ ๋ ฌ๊ธฐ์ค์ด ๋๋ฌด ๋ง์์ ์๊ฑด๋ณ๋ก ๋ชจ๋ ์ธ๋ฑ์ค ์์ฑ์ด ๋ถ๊ฐ๋ฅํ๊ฒฝ์ฐ
- group by์ ๊ฒฐ๊ณผ ๋๋ distict ๊ฐ์ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํด์ผํ๋๊ฒฝ์ฐ
- Union์ ๊ฒฐ๊ณผ ๊ฐ์ด ์์ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ๋ ฌํด์ผํ๋๊ฒฝ์ฐ
- ๋๋คํ๊ฒ ๊ฒฐ๊ณผ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ผํ๋ ๊ฒฝ์ฐ
์ํธ ๋ฒํผ
- ๋ฉ๋ชจ๋ฆฌ๋ด์์ ์ ๋ ฌํ๋๋ฐ ์ฐ์ด๋ ๋ฒํผ
- ๋ฌธ์ ๋ ๋ ์ฝ๋๊ฐ ๋๋ฌด ํฌ๋ฉด disk i/o๊ฐ ๋ฐ์ํด์ ์ฑ๋ฅ์ด ํ์ ํ ์ค์ด๋ ๋ค.
- ๊ทธ๋ ๋ค๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฆฌ๋๊ฑด ๋ถ์์ฉ์ด ๋๋ฌด ์ปค์ ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ผํ๋ค. (์ ์ฒด์ ์ธ ์๋ฒํ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ธ๊ฒฝ์ฐ ์ข ๋ฃ๋์ ํ๋ก์ธ์ค 1์์)
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๊ฒ๋ ํฌํจ์ค์ ์ฑ๊ธํจ์ค๊ฐ ์๋ค.
- ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์ํธ๋ฒํผ์ ๋ด์ผ๋ฉด ์ฑ๊ธํจ์ค, ์ ๋ ฌ ๊ธฐ์ค ์นผ๋ผ์ ๋ถ๋ฆฌํ๋ฉด ํฌํจ์ค
Single Pass Sort
- ๋ง ๊ทธ๋๋ก ์ฟผ๋ฆฌ ์์ฒญ์ ๋ชจ๋ ์นผ๋ผ์ ๋ฒํผ์ ๋ด๊ณ , ๊ทธ ๋ฒํผ๋ฅผ ์ ๋ ฌ์ํจ๋ค ๋ฐํ
Two Pass Sort
-
์ ๋ ฌ ๋์ ์นผ๋ผ๊ณผ ํ๋ผ์ด๋จธ๋ฆฌ ํค ๊ฐ๋ง ์ํธ ๋ฒํผ์ ๋ด์์ ์ ๋ ฌ์ ์ํํ๊ณ , ์ ๋ ฌ๋ ์์๋๋ก ๋ค์ ํ๋ผ์ด๋จธ๋ฆฌํค๋ก select
-
์ต์ ๋ฒ์ ์์๋ ๋ณดํต์ Single Pass ๋ฅผ ์ด์ฉํ์ง๋ง, ๊ฒฝ์ฐ์๋ฐ๋ผ Two Pass๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
- ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ ์์คํ ๋ณ์์ ์ค์ ๋ ์ํธํ ๋์ ๋ ์ฝ๋ ๊ฐ๋ณด๋ค ํด ๋
- BLOB or Text Type Comlumn์ด Select ๋์์ ํฌํจ๋ ๋
- ๊ทธ ์ธ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก Two Pass Sort๊ฐ ๋น ๋ฅด๋ค. (๋ค๋ง ํฐ ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ธ๊ฒ ๊ฐ์์ ์ด๋ ๊ฒ ์ด์ผ๊ธฐ ํ ๊ฒ ๊ฐ๋ค)
์ ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- ์ฟผ๋ฆฌ์ order by๊ฐ ์ฌ์ฉ๋๋ฉด ๋ฐ๋์ ์๋ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ : (extra column์) ๋ณ๋ ํ๊ธฐ ์์
- ์กฐ์ธ์์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ : (extra column์) “Using filesort”
- ์กฐ์ธ์์ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ๋ก ์ ์ฅ ํ ์ ๋ ฌ : (extra column์) “Using temporary; Using filesort”
- ๋ง์ฝ ์กฐ์ธ์ด ๋๋ค๋ฉด
- ์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌํ ๋ค์ ์กฐ์ธ ์ํ
- ์กฐ์ธ์ด ๋๋๊ณ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์จ ํ ์ ๋ ฌ์ ์ํ
- ๋น์ฐํ์ง๋ง, ์ ์๊ฐ ํจ์ฌ ๊ณต๊ฐํจ์จ์ฑ์ด ๋๊ธฐ๋๋ฌธ์ ์ ์๋ฅผ ๋จผ์ ๊ณ ๋ คํ ๊ฒ์ด๋ค.
์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ
- ๋ฐ๋์ order by์ ๋ช ์๋ ์นผ๋ผ์ด ์ ์ผ ๋จผ์ ์ฝ๋ ํ ์ด๋ธ์ ์ํ๊ณ , order by ์์๋๋ก ์์ฑ๋ ์ธ๋ฑ์ค๊ฐ ์์ด์ผํจ.
- ๋ํ where์ ์ ์ฒซ ๋ฒ์งธ๋ก ์ฝ๋ ํ ์ด๋ธ์ ์นผ๋ผ์ ๋ํ ์กฐ๊ฑด์ด ์๋ค๋ฉด ๊ทธ ์กฐ๊ฑด๊ณผ orderby๋ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
- ์ฌ๋ฌ ํ ์ด๋ธ์ด ์กฐ์ธ๋๋ ๊ฒฝ์ฐ ๋ค์คํฐ๋ ๋ฃจํ ๋ฐฉ์์ ์กฐ์ธ์์๋ง ์ด ๋ฐฉ์์ ์ด์ฉํ ์ ์๋ค.
- ์ด๋ ๊ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์์ง์์ ๋ณ๋์ ์ฒ๋ฆฌ๋ฅผ ํ์ง๋ ์๋๋ค ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋๋ก ์ฝ์ด์จ๋ค.
CREATE TABLE customers (
ย ย customer_id INT PRIMARY KEY,
ย ย customer_name VARCHAR(100)
);
CREATE TABLE orders (
ย ย order_id INT PRIMARY KEY,
ย ย customer_id INT,
ย ย order_date DATE,
ย ย amount DECIMAL(10, 2),
ย ย FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE INDEX idx_orders_order_date ON orders(order_date);
EXPLAIN ANALYZE
SELECT o.order_id, o.order_date, c.customer_name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2024-02-02'
ORDER BY o.order_date;
-- Index Scan using idx_orders_order_date on orders o
-- Index Cond: (order_date >= '2024-02-02')
-- -> Nested Loop Join with customers c
-- Filter: o.customer_id = c.customer_id
SELECT o.order_id, o.order_date, c.customer_name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2024-02-02'
ORDER BY c.customer_name; -- Warn : customers ํ
์ด๋ธ์ ์ปฌ๋ผ์ผ๋ก ์ ๋ ฌ
์กฐ์ธ์์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ
SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 10002 AND 10010
ORDER BY e.last_name;
- employees ์์
e.emp_no BETWEEN 10002 AND 10010๋ง์กฑํ๋ 9๊ฑด์ ๊ฒ์ - ์ด ๋จ๊ณ์์ Filesort by last_name
- ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ก ์กฐ์ธ์ ์ํ
์์ ํ ์ด๋ธ์ ์ด์ฉํ ์ ๋ ฌ
SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 10002 AND 10010
ORDER BY s.salary;
- employees ์์
e.emp_no BETWEEN 10002 AND 10010๋ง์กฑํ๋ 9๊ฑด์ ๊ฒ์ - ์ด ๋จ๊ณ์์ Filesort๋ฅผ ํ ์ ์์
- ์กฐ์ธ ์ดํ ์ ๋ ฌํด์ ๋ฐํ (๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ๋ญ๋น)
์ ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ฑ๋ฅ ๋น๊ต
- ์๋ชป๋ order by๋ group by ๋๋ฌธ์ ์ฟผ๋ฆฌ๊ฐ ๋๋ ค์ง๋ ๊ฒฝ์ฐ๊ฐ ์์
- ์ ์ฟผ๋ฆฌ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ์ ๋ ฌ์ด๋ ๊ทธ๋ฃจํ ์์ ์ด ๋๋ฆฌ๊ฒ ๋์ํ๋์ง ํ์ธ
- ๊ทธ๋ฌ๊ธฐ ์ํด์ ์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ “์คํธ๋ฆฌ๋ฐ์ฒ๋ฆฌ”, “๋ฒํผ๋ง์ฒ๋ฆฌ"๋ก ๊ตฌ๋ถํด์ผํ๋ค.
์คํธ๋ฆฌ๋ฐ ๋ฐฉ์
- ๋ ์ฝ๋๊ฐ ๊ฒ์๋ ๋๋ง๋ค ๋ฐ๋ก๋ฐ๋ก ํด๋ผ์ด์ธํธ๋ก ์ ์ก
- ํด๋ผ์ด์ธํธ๋ ๊ณง๋ฐ๋ก ์ํ๋ ์ฒซ ๋ฒ์งธ ๋ ์ฝ๋๋ฅผ ์ ๋ฌ๋ฐ์
OLTPํ๊ฒฝ์์๋ ์ฟผ๋ฆฌ์ ์ฒซ ์์ฒญ์์๋ถํฐ ์ฒซ ๋ ์ฝ๋๋ฅผ ์ ๋ฌ๋ฐ๊ฒ๊น์ง์ ์๋ต์๊ฐ์ด ๊ฐ์ฅ ์ค์ํด์ ์์ฃผ์ฐ์- ์ด ๋ฐฉ์์์๋
LIMIT์ด ์ฟผ๋ฆฌ์ ๋น์ฉ์ ์๋นํ ์ค์ฌ์ค
๋ฒํผ๋ง๋ฐฉ์
ORDER BY๋GROUP BY๊ฐ์ ์ฒ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์คํธ๋ฆฌ๋ฐ๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๋ค.- ์ผ๋จ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ ๋ค์์ ์ฒ๋ฆฌ๋ฅผํด์ผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ถฉ์กฑ๋๊ธฐ ๋๋ฌธ
- ๋คํธ์ํฌ๋ก ์ ์ก๋๋ ๋ ์ฝ๋์ ๊ฑด์๋ฅผ ์ค์ผ์๋ ์์ผ๋ ์ฑ๋ฅํฅ์์๋ ๋์์ด ๋ณ๋ก ์๋ใท๋ค (์๋ฒ์์ ์ธก๋ฉด์์๋ ๊ธฐ๋ค์ง ๋ณํ๊ฐ ์์)
- ์๋๋ฅผ ๋ค์ ๋ณด๋ฉด
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ : ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก limit ์ถฉ์กฑํ ๋๊น์ง ์ฝ์ด์ ๊ทธ๋๊ทธ๋ ๋์ ธ์ฃผ๋ฉด ๋๋ค.
- ์กฐ์ธ์์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ : limit ์๋ฏธ์์, filesort ๋์์ด ๋๋ ๋ ์ฝ๋๋ค์ ๋ถ๋ฌ์ ์ ๋ ฌํ๋ค ์๋ผ์ ๋์ ธ์ค์ผํ๋ค.
- ์กฐ์ธ์์ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ๋ก ์ ์ฅ ํ ์ ๋ ฌ : ์์ ๋ง์ฐฌ๊ฐ์ง
select *
from tb_test1 t1, tb_test2 t2
where t1.col1 = t2.col2
order by t1.col2
limit 10
;
-- tb_test1์ ๋ ์ฝ๋๊ฐ 100๊ฑด์ด๊ณ , tb_test2์ ๋ ์ฝ๋๊ฐ 1000๊ฑด (1๊ฑด์ tb_test1๋น test2์ 10๊ฑด ์กด์ฌ ๊ฐ์ )
- tb_test1์ด ๋๋ผ์ด๋น ๋๋ ๊ฒฝ์ฐ
- (์ธ๋ฑ์ค)์ฝ์ด์ผํ ๊ฑด์ : t1 - 1๊ฑด, t2 - 10๊ฑด
- (์ธ๋ฑ์ค)์กฐ์ธ ํ์ 1๋ฒ
- (์ธ๋ฑ์ค)์ ๋ ฌ๋์ ๊ฑด์ : 0๊ฑด
- (์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ) ์ฝ์ด์ผํ ๊ฑด์ : t1 - 100๊ฑด, t2-10๊ฑด
- (์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ) ์กฐ์ธ ํ์ : 1๋ฒ
- (์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ) ์ ๋ ฌ ๋์ ๊ฑด์ : 100๊ฑด (t1์ ๋ ์ฝ๋ ๊ฑด์ ๋งํผ)
- (์์ ํ ์ด๋ธ ์ฌ์ฉํ ์ ๋ ฌ) ์ฝ์ด์ผํ ๊ฑด์ : t1 - 100๊ฑด, t2 - 1000๊ฑด
- (์์ ํ ์ด๋ธ ์ฌ์ฉํ ์ ๋ ฌ) ์กฐ์ธ ํ์ : 100๋ฒ (t1์ ๋ ์ปค๋ ๊ฑด ์ ๋งํผ)
- (์์ ํ ์ด๋ธ ์ฌ์ฉํ ์ ๋ ฌ) ์ ๋ ฌ๋์ ๊ฑด์ : 1000๊ฑด
- tb_test2์ด ๋๋ผ์ด๋น ๋๋ ๊ฒฝ์ฐ
- (์ธ๋ฑ์ค)์ฝ์ด์ผํ ๊ฑด์ : t1 - 10๊ฑด, t2 - 10๊ฑด
- (์ธ๋ฑ์ค)์กฐ์ธ ํ์ 10๋ฒ
- (์ธ๋ฑ์ค)์ ๋ ฌ๋์ ๊ฑด์ : 0๊ฑด
- …
๊ฒฐ๋ก ์ ๊ฐ๋ฅํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ํ๊ณ , ๊ทธ๊ฒ ์ด๋ ต๋๋ผ๋ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌํด๋ ๋๋๋ก ์ฒ๋ฆฌํด์ผํ๋ค.
์ ๋ ฌ ๊ด๋ จ ์ํ ๋ณ์
| ๋ณ์๋ช | ์ค๋ช |
|---|---|
| Sort_merge_passes | ์ ๋ ฌ์ ์ํด ๋ณํฉ์ด ์ํ๋ ํ์ |
| Sort_range | ORDER BY๊ฐ ๋ฒ์ ์ค์บ์ ์ฌ์ฉํ์ฌ ์ ๋ ฌ๋ ํ์ |
| Sort_rows | ์ ๋ ฌ์ ์ํด ์ฒ๋ฆฌ๋ ์ด ํ ์ |
| Sort_scan | ORDER BY๊ฐ ์ ์ฒด ํ
์ด๋ธ ์ค์บ์ ์ฌ์ฉํ์ฌ ์ ๋ ฌ๋ ํ์ |
Group by ์ฒ๋ฆฌ
Group by ๋ํ, order by์ ๊ฐ์ด ์ฟผ๋ฆฌ๊ฐ ์คํธ๋ฆฌ๋ฐ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒํจ group by์ ์ฌ์ฉ๋ ์กฐ๊ฑด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌ๋ ์ ์์ผ๋ฏ๋ก having์ ์ ํ๋ํ๋ ค๊ณ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ํ ํ์๋ ์์
์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ group by (ํ์ดํธ ์ธ๋ฑ์ค ์ค์บ)
- ์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ํ ์นผ๋ผ๋ง ์ด์ฉํด ๊ทธ๋ฃจํ ํ ๋ group by ์นผ๋ผ์ผ๋ก ์ด๋ฏธ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ๊ทธ ์ธ๋ฑ์ค๋ฅผ ์ฐจ๋ก๋๋ก ์ฝ์ผ๋ฉด์ ๊ทธ๋ฃจํ ์์ ์ ์ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก ์กฐ์ธ์ ์ฒ๋ฆฌํจ
- ๋ฌผ๋ก ์ง๊ณํจ์๋ฑ์ ์ฐ๋ฉด์ ์์ ํ ์ด๋ธ์ด ํ์ ํ ์ ์๊ธด ํจ
๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ group by
- GROUP BY ์ฐ์ฐ ์ ์ผ๋ถ ์ธ๋ฑ์ค ํค๋ง ์ฝ๊ณ , ๋๋จธ์ง ํ์ ๊ฑด๋๋ฐ๋ ๋ฐฉ์
- GROUP BY ๋์ ์ปฌ๋ผ์ด ์ธ๋ฑ์ค์ ์ ๋(prefix) ๋ถ๋ถ๊ณผ ์ผ์นํด์ผ ํ๋ค. ย
-- min, max ์ด์ธ์ ์งํฉ ํจ์ ์ฌ์ฉ์ ๋ฃจ์ค์ธ๋ฑ์ค ์ํ
select col1, sum(col2) from test group by col1;
-- group by์ ์ฌ์ฉ๋ ์นผ๋ผ์ด ์ธ๋ฑ์ค ๊ตฌ์ฑ ์นผ๋ผ์ ์ผ์ชฝ๋ถํฐ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๋ถ๊ฐ
select col1, col2 from test group by col2, col3;
-- select์ ์ ์นผ๋ผ์ด group by์ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๋ถ๊ฐ
select col1, col3 from test group by col1, col2;
| ๋น๊ต ํญ๋ชฉ | ํ์ดํธ ์ธ๋ฑ์ค ์ค์บ | ๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ |
|---|---|---|
| ์ฒ๋ฆฌ ๋ฐฉ์ย ย ย ย ย ย | ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ฝ์ | ์ผ๋ถ ์ธ๋ฑ์ค๋ง ์ฝ์ |
| ์ฑ๋ฅ ย ย ย ย ย ย ย ย | ๋ณดํต ๋น ๋ฆ | ๋ ๋น ๋ฆ |
| ์ ์ฉ ๊ฐ๋ฅ ํจ์ ย ย ย | COUNT() ๊ฐ๋ฅ | MIN(), MAX() ๊ฐ๋ฅ |
| WHERE ์ ํ์ ์ฌ๋ถ ย | ํ์ ์์ | WHERE๊ฐ ์์ผ๋ฉด ๋ ํจ๊ณผ์ |
| FileSort ์ฌ์ฉ ์ฌ๋ถ ย | ์ฌ์ฉ ์ ํจ | ์ฌ์ฉ ์ ํจ |
์์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ group by
- GROUP BY ๋์ ์ปฌ๋ผ์ด ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํ ๋ ย
- GROUP BY์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ์ SELECT ํ ๋ (Loose Index Scan ์ ์ฉ ๋ถ๊ฐ) ย
- ORDER BY๊ฐ GROUP BY์ ๋ค๋ฅธ ๊ฒฝ์ฐ ย
- HAVING ์ ์ด ํฌํจ๋ ๊ฒฝ์ฐ ย
Distinct ์ฒ๋ฆฌ
ํน์ ์นผ๋ผ์ ์ ๋ํฌํ ๊ฐ๋ง ์กฐํํ๋ ค๋ฉด distinct๋ฅผ ์ฌ์ฉํ๋ค. distinct๋ min, max ๋๋ count๊ฐ์ ์งํฉํจ์์ ํจ๊ป ์ฌ์ฉ๋๋๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ค๋ฅด๋ค. ๊ทธ๋ฆฌ๊ณ ์งํฉํจ์์ ๊ฐ์ด distinct๊ฐ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์์ distinct์ฒ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ ๋ ํญ์ ์์ ํ ์ด๋ธ์ด ํ์ํ๋ค. (์คํ๊ณํ์ extra column์์๋ using temporary๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค.)
select distinct …
-- 8.0 ์ด์์์๋ group by ์ํํ๋ ์ฟผ๋ฆฌ์ orderby์ ์ด ์์ผ๋ฉด ์ ๋ ฌ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์,
-- ๋ค์์ ๋ ์ฟผ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ์์
์ ์ํํ๋ค.
select distinct emp_no from salaries;
select emp_no from salaries group by emp_no;
์งํฉ ํจ์์ ํจ๊ป ์ฌ์ฉ๋ distinct
- ์งํฉ ํจ์๊ฐ ์๋ select์ฟผ๋ฆฌ์์ distinct๋ ์กฐํํ๋ ๋ชจ๋ ์นผ๋ผ์ ‘์กฐํฉ์ด’ ์ ๋ํฌํ ๊ฒ๋ค๋ง ๊ฐ์ ธ์จ๋ค.
- ํ์ง๋ง ์งํฉํจ์ ๋ด์์ ์ฌ์ฉ๋ distinct๋ ๊ทธ ์งํฉ ํจ์์ ‘์ธ์๋ก ์ ๋ฌ๋ ์นผ๋ผ๊ฐ์ด ์ ๋ํฌํ ๊ฒ๋ค’์ ๊ฐ์ ธ์จ๋ค.
| id | department | role | salary |
|---|---|---|---|
| 1 | HR | Manager | 60000 |
| 2 | HR | Staff | 50000 |
| 3 | HR | Staff | 50000 |
| 4 | IT | Engineer | 70000 |
| 5 | IT | Engineer | 75000 |
| DISTINCT ์ฌ์ฉ ๋ฐฉ์ | ๋์ ๋ฐฉ์ | ์์ ์ฟผ๋ฆฌ | ๊ฒฐ๊ณผ ์์ |
|---|---|---|---|
| ์งํฉ ํจ์ ์์ด ์ฌ์ฉ | ์กฐํํ๋ ๋ชจ๋ ์ปฌ๋ผ์ ์กฐํฉ์ด ์ ๋ํฌํ ๊ฐ๋ค๋ง ๋ฐํ | SELECT DISTINCT department, role FROM employees; |
HR, ManagerHR, StaffIT, Engineer |
| ์งํฉ ํจ์ ๋ด์์ ์ฌ์ฉ | ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ์ปฌ๋ผ์์ ์ ๋ํฌํ ๊ฐ๋ค๋ง ๊ณ ๋ คํ์ฌ ์ฐ์ฐ ์ํ | SELECT COUNT(DISTINCT department) FROM employees; |
2 |
| SUM(DISTINCT salary) | salary ์ปฌ๋ผ์ ๊ณ ์ ํ ๊ฐ๋ค๋ง ํฉ์ฐ |
SELECT SUM(DISTINCT salary) FROM employees; |
255000 |
-- ์ฟผ๋ฆฌ A
select distinct first_name, last_name
from employees
where emp_no between 10001 and 10200;
-- ์ฟผ๋ฆฌ B
select distinct count(distinct first_name), count(distinct last_name)
from employees
where emp_no between 10001 and 10200;
-- ์ฟผ๋ฆฌ C
select count(distinct first_name, last_name)
from employees
where emp_no between 10001 and 10200;
| ์ฟผ๋ฆฌ | ๋ด๋ถ ํ ์ด๋ธ ์์ฑ ๋ฐฉ์ | ์ ๋ ฌ ๋ฐ ์ธ๋ฑ์ค ์ฌ์ฉ | ์ฒ๋ฆฌ ๋ฐฉ์ |
|---|---|---|---|
์ฟผ๋ฆฌ A |
first_name, last_name์ ํฌํจํ๋ ์์ ํ
์ด๋ธ ์์ฑ |
first_name, last_name์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์ค๋ณต ์ ๊ฑฐ |
ํ
์ด๋ธ์ ์ค์บํ ํ ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ์ ๋ํฌํ (first_name, last_name) ์กฐํฉ๋ง ๋ฐํ |
์ฟผ๋ฆฌ B |
first_name๊ณผ last_name ๊ฐ๊ฐ์ ์ ๋ํฌํ ๊ฐ๋ง ์ ์ฅํ๋ ์์ ํ
์ด๋ธ ๋ ๊ฐ ์์ฑ |
first_name๊ณผ last_name ๊ฐ๊ฐ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ |
first_name๊ณผ last_name์ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ ฌ ํ ์ ๋ํฌํ ๊ฐ๋ค์ ๊ฐ์๋ฅผ ๊ณ์ฐ |
์ฟผ๋ฆฌ C |
(first_name, last_name) ์กฐํฉ์ ์ ์ฅํ๋ ๋จ์ผ ์์ ํ
์ด๋ธ ์์ฑ |
(first_name, last_name)์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์ค๋ณต ์ ๊ฑฐ ํ ๊ฐ์ ๊ณ์ฐ |
์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ค์บํ ํ (first_name, last_name) ์กฐํฉ์ ์ค๋ณต ์์ด ์ ์ฅํ๊ณ ๊ฐ์๋ฅผ ๊ณ์ฐ |
| ๋ด๋ถ ํ ์ด๋ธ ์์ฑ ๊ด์ ์์์ ์ฐจ์ด์ |
- ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ first_name, last_name์ ํฌํจํ๋ ์์ ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ค์บํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ ํ ๋ฐํํ๋ค.
- ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ first_name๊ณผ last_name์ ๊ฐ๊ฐ ๋ค๋ฃจ๋ฏ๋ก, ๋ด๋ถ์ ์ผ๋ก ๋ ๊ฐ์ ๋ณ๋ ์งํฉ์ ์์ฑํ์ฌ ๊ฐ ์ปฌ๋ผ์์ ์ ๋ํฌํ ๊ฐ์ ์นด์ดํธํ๋ค.
- ์ธ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ (first_name, last_name)์ ์กฐํฉ์ด ์ ๋ํฌํ ๊ฐ์๋ฅผ ์ฐพ๊ธฐ ์ํด ๋จ์ผ ์์ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ํด๋น ์กฐํฉ์ ์ ๋ ฌํ ํ ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. ์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ
- first_name, last_name์ ๊ฐ๋ณ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ํ์ง๋ง ์ฒซ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ๋ ๊ฐ์ ์ปฌ๋ผ์ ๋์์ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก, ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๋ง์ผ๋ก ์ต์ ํ๋๊ธฐ ์ด๋ ต๊ณ , ์ ๋ ฌ(Sort) ๋๋ ์์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- (first_name, last_name) ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ค๋ฉด, ์ฒซ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์ฑ๋ฅ์ด ๊ฐ์ ๋ ์ ์๋ค.
๊ฒฐ๋ก
- ๋จ์ํ DISTINCT ์กฐํ(SELECT DISTINCT first_name, last_name)๋ ๊ฒฐ๊ณผ ์งํฉ์ ๋ฐํํด์ผ ํ๋ฏ๋ก, ์์ ํ ์ด๋ธ์ ์์ฑํ๊ณ ์ ๋ ฌ์ ์ํํด์ผ ํ๋ค.
- **COUNT(DISTINCT ์ปฌ๋ผ)์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ปฌ๋ผ๋ณ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ฉฐ, ์ธ๋ฑ์ค๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ DISTINCT๋ก ๊ฐ์๋ฅผ ์ธ๋ ๊ฒฝ์ฐ(COUNT(DISTINCT first_name, last_name))๋ (first_name, last_name)์ ํ๋์ ์กฐํฉ์ผ๋ก ์ธ์ํ์ฌ ์ฒ๋ฆฌํ๋ ๋จ์ผ ์์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
๋ด๋ถ ์์ ํ ์ด๋ธ ํ์ฉ
์ ๋ ฌ ํน์ ๊ทธ๋ฃจํ ํ ๋ ์์์ ์ผ๋ก ์ฌ์ฉํ๋ ํ ์ด๋ธ, ์ฆ ์ง์ ๋ง๋ create temporary table๊ณผ๋ ๋ค๋ฆ ๋์คํฌ์ ์์ํ ์ด๋ธ์ด ๋ง๋ค์ด์ง๋๋ ์์
disk vs memory
- 1gb๊ฐ ๋์ผ๋ฉด ๋์คํฌ๋ก ๋๊น
- ์ค๋ฒํค๋๊ฐ ์ ์ mmap์ผ๋ก ๋๊ธฐ๋๊ฒ ๊ธฐ๋ณธ ๋ณ์๋ก ์ค์ ๋์ด์์
์์ํ ์ด๋ธ์ด ํ์ํ ์ฟผ๋ฆฌ
- order by, group by์ ๋ช ์๋ ์นผ๋ผ์ด ๋ค๋ฅธ ์ฟผ๋ฆฌ
- order by, group by์ ๋ช ์๋ ์นผ๋ผ์ด ์กฐ์ธ์ ์์์ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ด ์๋ ์ฟผ๋ฆฌ
- distinct์ order by๊ฐ ๋์์ ์ฟผ๋ฆฌ์ ์กด์ฌํ๋๊ฒฝ์ฐ ๋๋ distinct๊ฐ ์ธ๋ฑ์ค๋ก ์ฒ๋ฆฌ๋์ง ๋ชปํ๋ ์ฟผ๋ฆฌ
- union์ด๋ union distinct๊ฐ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ
- ์ฟผ๋ฆฌ ์คํ ๊ณํ์์ select_type์ด derived์ธ ์ฟผ๋ฆฌ
๊ณ ๊ธ ์ต์ ํ
์คํ ๊ณํ
ํต๊ณ ์ ๋ณด
- 8.0 ๋ฒ์ ์ดํ๋ถํฐ ์ธ๋ฑ์ค๋์ง ์์ ์นผ๋ผ๋ค์ ๋ํด์๋ ๋ฐ์ดํฐ ๋ถํฌ๋๋ฅผ ์์งํด์ ์ ์ฅํ๋ ํ์คํ ๊ทธ๋จ์ด ๋์ ๋๋ค.
ํ ์ด๋ธ ๋ฐ ์ธ๋ฑ์ค ํต๊ณ์ ๋ณด
- ๋น์ฉ๊ธฐ๋ฐ ์ต์ ํ์์ ๊ฐ์ฅ ์ค์ํ๊ฑด ํต๊ณ์ ๋ณด
- 8.0 ์ด์ ๊น์ง๋ ํต๊ณ์ ๋ณด๊ฐ ์ง๋์น๊ฒ ๋ถ์ ํํด์ ์ด์์์
MySQL ์๋ฒ์ ํต๊ณ ์ ๋ณด
- ๊ธฐ์กด์๋ ํต๊ณ์ ๋ณด๊ฐ ๋ฉ๋ชจ๋ฆฌ์๋ง ์์ด์ ํ๋ฐ์ฑ์ด ์์์
- ๊ทธ๋ฌ๋ ์ต๊ทผ์๋ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํจ์ผ๋ก์จ ์ ์ง
| database_name | table_name | index_name | stat_name | stat_value | sample_size | last_update |
|---|---|---|---|---|---|---|
| employees | employees | PRIMARY | n_diff_pfx01 | 300024 | 100 | 2025-03-01 |
| employees | employees | PRIMARY | n_leaf_pages | 1024 | NULL | 2025-03-01 |
| employees | employees | PRIMARY | size | 2048 | NULL | 2025-03-01 |
| employees | employees | idx_lastname | n_diff_pfx01 | 250000 | 100 | 2025-03-01 |
| employees | employees | idx_lastname | n_leaf_pages | 512 | NULL | 2025-03-01 |
| employees | employees | idx_lastname | size | 1024 | NULL | 2025-03-01 |
- ๊ฐ ์นผ๋ผ์ ์๋ฏธ
| ์ปฌ๋ผ๋ช | ์๋ฏธ |
|---|---|
| database_name | ํด๋น ์ธ๋ฑ์ค๊ฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ (employees) |
| table_name | ํด๋น ์ธ๋ฑ์ค๊ฐ ์ํ ํ
์ด๋ธ์ ์ด๋ฆ (employees) |
| index_name | ํด๋น ํ
์ด๋ธ์์ ์์ง๋ ํต๊ณ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ธ๋ฑ์ค์ ์ด๋ฆ (PRIMARY, idx_lastname ๋ฑ) |
| stat_name | ์ธ๋ฑ์ค์ ํต๊ณ ์ ๋ณด ํญ๋ชฉ (์ค๋ช ์ ์๋ ์ฐธ๊ณ ) |
| stat_value | ํด๋น ํต๊ณ ํญ๋ชฉ์ ๊ฐ |
| sample_size | ํต๊ณ๋ฅผ ์์งํ ๋ ์ฌ์ฉํ ์ํ ํฌ๊ธฐ (์ผ๋ถ ํต๊ณ ํญ๋ชฉ์ ์ ์ฉ๋จ) |
| last_update | ํต๊ณ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ์ ๋ฐ์ดํธ๋ ๋ ์ง ๋ฐ ์๊ฐ |
- stat_name ํญ๋ชฉ ์ค๋ช
| stat_name | ์ค๋ช |
|---|---|
| n_diff_pfx01 | ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ (์นด๋๋๋ฆฌํฐ) |
| n_leaf_pages | ํด๋น ์ธ๋ฑ์ค์ ๋ฆฌํ(leaf) ํ์ด์ง ๊ฐ์ (B-ํธ๋ฆฌ ์ธ๋ฑ์ค์ ๋ฆฌํ ๋ ธ๋) |
| size | ํด๋น ์ธ๋ฑ์ค๊ฐ ์ฐจ์งํ๋ ์ ์ฒด ํ์ด์ง ์ (n_leaf_pages๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์) |
| n_rows | ์ ์ฒด ๋ ์ฝ๋ ๊ฑด์ |
| clustered_index_size | ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ํฌ๊ธฐ (InnoDB ํ์ด์ง ๊ฐ์) |
| sum_of_other_index_size | ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ฅผ ์ ์ธํ ์ธ๋ฑ์ค์ ํฌ๊ธฐ |
ํ์คํ ๊ทธ๋จ
- ๋ถํฌ๋ฅผ ๋ณด๊ธฐ์ํจ
- ์ง์ ์์ง๋์ง๋ ์๊ณ ๋ช
์์ ์ผ๋ก
analyze table ... update histogram์ด๋ผ๋ ์ฟผ๋ฆฌ๋ก ์ํํด์ผํจ - ์ํ๋ง ๊ฐฏ์๋ฑ์ ์ค์ ๊ฐ๋ฅํจ
- ํ๊ฒฝ๋ณ์๊ฐ์ผ๋ก ์ตํฐ๋ง์ด์ ๊ฐ ํ์คํ ๊ทธ๋จ์ ์ฐธ๊ณ ํ ์ง ๋ง์ง ์ ํ ์ ์์
ํ์คํ ๊ทธ๋จ์ ์ฉ๋
- ๋ฒํท๋ณ๋ก ๋ ์ฝ๋์ ๊ฐฏ์์, ์ ๋ํฌํ ๊ฐ์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค.
- ์ด ์ ๋ณด๋ฅผ ํ ๋๋ก ์ฑ๋ฅ์ ์ผ๋ก ์ ๋ฆฌํ ์ ํ์ ํ๋ค.
- ์ฃผ๋ก ์ธ๋ฑ์ค ๋์ง ์์ ์นผ๋ผ์ ๋ถํฌ๋ฅผ ์ฌ์ฉํ ๋ ์
์กฐ์ธ ์ ์ ์์ ํ ์ด๋ธ์ ํํฐ๋งํ๋ฉด ๋น ๋ฆ, ๋ถํฌ๊ฐ 25ํผ์ผํธ๊ฐ ๋๋๋ค๊ณ ํ๋จํ๋ฉด ํํ ์ด๋ธ ์ค์บ์ด ๋น ๋ฆ ๋ฑ๋ฑ์ผ๋ก ์ ๋ฆฌํ ์ ํ์ ํ๋ค๋ ๋ป.
ํ์คํ ๊ทธ๋จ๊ณผ ์ธ๋ฑ์ค
- ์ฌ์ค ํต๊ณ์ ๋ณด๋ง ํ์ฉํ๋๊ฒ์ด ์๋๋ผ, ์ธ๋ฑ์ค๋ฅผ ์ํ๋งํด์ ๊ณํ์ ์๋ฆฝํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
- ์กฐ๊ฑด์ ์ ๋ ์ฝ๋ ๊ฑด์๋ฅผ ์์ธกํ๊ธฐ ์ํด ์ตํฐ๋ง์ด์ ๋ ์ค์ ์ธ๋ฑ์ค์ b-tree๋ฅผ ์ํ๋งํด์ ์ดํด๋ณธ๋ค.
- ์ด ์์์
Index Dive๋ผ๊ณ ํจ
์ฝ์คํธ ๋ชจ๋ธ
- mysql ์๋ฒ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์์
์ ํ์๋ก ํ๋ค.
- ๋์คํฌ๋ก๋ถํฐ ๋ฐ์ดํฐ ํ์ด์ง ์ฝ๊ธฐ
- ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๋ฐ์ดํฐ ํ์ด์ง ์ฝ๊ธฐ
- ์ธ๋ฑ์ค ํค ๋น๊ต
- ๋ ์ฝ๋ ํ๊ฐ
- ๋ฉ๋ชจ๋ฆฌ ์์ ํ ์ด๋ธ ์์
- ๋์คํฌ ์์ ํ ์ด๋ธ ์์
- ์์ ๊ฐ์ ์์ ์ด ์ผ๋ง๋ ํ์ํ ์ง ์์ธกํ๊ณ ์ ์ฒด ์์ ใ ๋น์ฉ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ต์ ์ ์คํ ๊ณํ์ ์ฐพ๋๋ค.
- ์ด๋ ๊ฒ ์ ์ฒด ์ฟผ๋ฆฌ์ ๋น์ฉ์ ๊ณ์ฐํ๋๋ฐ ํ์ํ ๋จ์ ์์
๋ค์ ๋น์ฉ์
Cost Model์ด๋ผ๊ณ ํ๋ค. - ๊ฒฐ๋ก ์ ์ผ๋ก 8.0 ์ด์์ ์ฝ์คํธ๋ชจ๋ธ์ ๋ค์ ๋๊ฐ์ ์ค์ ๊ฐ์ ์ฌ์ฉํ๋ค.
server_cost: ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ ๋ ์ฝ๋๋ฅผ ๋น๊ตํ๊ณ ์์ ํ ์ด๋ธ ์ฒ๋ฆฌ์ ๋ํ ๋น์ฉ ๊ด๋ฆฌengine_cost: ๋ ์ฝ๋๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ํ์ํ ๋น์ฉ ๊ด๋ฆฌ- ๋ ๊ฐ์ ํ
์ด๋ธ๋ก ๊ด๋ฆฌ๋๋๋ฐ ๋ค์๊ณผ๊ฐ์ ์นผ๋ผ๋ค์ ๊ฐ์ง๊ณ ์๋ค.
- ์ดํ ๊ณตํต
cost_name: ์ฝ์คํธ ๋ชจ๋ธ์ ๊ฐ ๋จ์ ์์default_vallue: ๊ฐ ๋จ์ ์์ ์ ๋น์ฉcost_value: dbms๊ด๋ฆฌ์๊ฐ ์ค์ ํ ๊ฐlast_updated: ๋จ์ ์์ ์ ๋น์ฉ์ด ๋ณ๊ฒฝ๋ ์์ comment: ๋น์ฉ์ ๋ํ ์ถ๊ฐ ์ค๋ช
- ์ดํ engine_cost์๋ง ์ถ๊ฐ์ ์ผ๋ก ์๋ ์นผ๋ผ
engine_name: ๋น์ฉ์ด ์ ์ฉ๋ ์คํ ๋ฆฌ์ง ์์งdevice_type: ๋์คํฌ ํ์
- ์ดํ ๊ณตํต
| ๋จ์ ์์ | ๊ธฐ๋ณธ๊ฐ (Default Value) | ์ค๋ช | ์์ง ์ฝ์คํธ | ์๋ฒ ์ฝ์คํธ | ๋์ด๋ฉด |
|---|---|---|---|---|---|
disk_temptable_create_cost |
20.0 | ๋์คํฌ ๊ธฐ๋ฐ ์์ ํ ์ด๋ธ์ ์์ฑํ๋ ๋น์ฉ. ๋ด๋ถ์ ์ผ๋ก ๋์คํฌ ๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง ์์ง(InnoDB ๋๋ MyISAM)์ ์ฌ์ฉํ๋ ์์ ํ ์ด๋ธ ์์ฑ ์ ๋ฐ์. | โ | ๋์คํฌ์ ์์ ํ ์ด๋ธ์ ๋ง๋ค์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์คํ๊ณํ ์๋ฆฝ | |
disk_temptable_row_cost |
0.5 | ๋์คํฌ ๊ธฐ๋ฐ ์์ ํ ์ด๋ธ์ ํ์ ์ถ๊ฐํ๋ ๋น์ฉ. | โ | ๋์คํฌ์ ์์ ํ ์ด๋ธ์ ๋ง๋ค์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์คํ๊ณํ ์๋ฆฝ | |
memory_temptable_create_cost |
1.0 | ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์์ ํ
์ด๋ธ์ ์์ฑํ๋ ๋น์ฉ. MEMORY ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ์์ ํ
์ด๋ธ ์์ฑ ์ ๋ฐ์. |
โ | ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ์ด๋ธ์ ๋ง๋ค์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์คํ๊ณํ ์๋ฆฝ | |
memory_temptable_row_cost |
0.1 | ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์์ ํ ์ด๋ธ์ ํ์ ์ถ๊ฐํ๋ ๋น์ฉ. | โ | ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ์ด๋ธ์ ๋ง๋ค์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์คํ๊ณํ ์๋ฆฝ | |
key_compare_cost |
0.05 | ๋ ์ฝ๋ ํค๋ฅผ ๋น๊ตํ๋ ๋น์ฉ. ์ด ๊ฐ์ด ๋์์๋ก ๋ง์ ํค ๋น๊ต๋ฅผ ์ํํ๋ ์ฟผ๋ฆฌ ๊ณํ์ ๋น์ฉ์ด ์ฆ๊ฐํ์ฌ, ์ ๋ ฌ์ ํผํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ๊ณํ์ ์ ํธํ๊ฒ ๋จ. | โ | ์ ๋ ฌ์ ์ํํ์ง ์๋ ๋ฐฉํฅ์ ์ํ ๊ณํ์ ์๋ฆฝ | |
row_evaluate_cost |
0.1 | ๋จ์ผ ํ์ ํ๊ฐ(๊ณ์ฐ)ํ๋ ๋น์ฉ. | โ | ํ์ค์บ์ ์คํํ๋ ๋น์ฉ์ด ๋์ด๋์ ๊ฐ๋ฅํ ์ธ๋ฑ์ค ์ค์บ์ ์คํํ๋๋ก ์คํ๊ณํ ์๋ฆฝ | |
io_block_read_cost |
1.0 | ๋์คํฌ์์ ๋ธ๋ก์ ์ฝ๋ ๋น์ฉ. | โ | ๋ฒํผํ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ ๋์์ง | |
memory_block_read_cost |
0.25 | ๋ฉ๋ชจ๋ฆฌ์์ ๋ธ๋ก์ ์ฝ๋ ๋น์ฉ. | โ |
row_evaluate_cost: ์คํ ๋ฆฌ์ง ์์ง์ด ๋ฐํํ ๋ ์ฝ๋๊ฐ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ผ์นํ๋์ง๋ฅผ ํ๊ฐํ๋ ๋จ์ ์์- ์ด ๊ฐ์ด ์ฆ๊ฐํ ์๋ก ํํ ์ด๋ธ ์ค์บ๊ณผ ๊ฐ์ด ๋ง์ ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋น์ฉ์ด ๋์์ง๊ณ ,
- ๋ฐ๋๋ก ๋ ์ธ์ง ์ค์บ๊ณผ ๊ฐ์ด ์๋์ ์ผ๋ก ์ ์ ์์ ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ์ฟผ๋ฆฌ์ ๋น์ฉ์ด ๋ฎ์์ง๋ค.
key_compare_cost: ํค๊ฐ์ ๋น๊ต์์ ์ ํ์ํ ๋น์ฉ์ ์๋ฏธํ๋๋ฐ, ๋ ์ฝ๋ ์ ๋ ฌ๊ณผ ๊ฐ์ด ํค๊ฐ ๋น๊ต ์ฒ๋ฆฌ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ์ ๋น์ฉ์ด ๋์์ง๋ค.
ํ์คํ DBA์ ์์ญ์ธ ๊ฒ ๊ฐ๋ค
์คํ ๊ณํ ํ์ธ
์คํ ๊ณํ ์ถ๋ ฅ ํฌ๋งท
FORMAT=์ผ๋ก ์ค ์ ์์ (json, tree ๋ฑ๋ฑ)
์ฟผ๋ฆฌ์ ์คํ ์๊ฐ ํ์ธ
EXPLAIN ANALYZE๋ก ํธ๋ฆฌํ์์ผ๋ก ๋จ๊ณ๋ณ ์์์๊ฐ์ ๋ณผ ์ ์์
EXPLAIN ANALYZE
SELECT e.emp_no, AVG(s.salary)
FROM employees e
INNER JOIN salaries s ON s.emp_no = e.emp_no
AND s.salary > 50000
AND s.from_date <= '1990-01-01'
AND s.to_date > '1990-01-01'
WHERE e.first_name = 'Matt'
GROUP BY e.hire_date;
A) -> Table scan on <temporary> (actual time=0.001..0.004 rows=48 loops=1)
B) -> Aggregate using temporary table (actual time=3.779..3.808 rows=48 loops=1)
C) -> Nested loop inner join (cost=685.24 rows=135) (actual time=0.367..3.602 rows=48 loops=1)
D) -> Index lookup on e using ix_firstname (first_name='Matt') (cost=215.08 rows=233) (actual time=0.348 1.046 rows=233 loops=1)
E) -> Filter: (...where์ ํํฐ๋ค)
F) -> Index lookup on s using primary (emp_no=e.emp_no)
- ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊ฐ์ ๋ ๋ฒจ์์๋ ์๋จ์ ๋ผ์ธ์ด ๋จผ์
- ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ ๋ฒจ์์๋ ๊ฐ์ฅ ์์ชฝ์ ์์นํ ๋ผ์ธ์ด ๋จผ์
๊ทธ๋์ ์๋์ฒ๋ผ ์คํ๋๋ค
1. D) Index lookup on e using ix_firstname // employees ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ํตํด first_name=Matt์กฐ๊ฑด์ ๋ ์ฝ๋ ์ฐพ๊ธฐ
2. F) Index lookup on s using primary // salaries ํ
์ด๋ธ์ pk๋ก emp_no๊ฐ 1๋ฒ ๊ฒฐ๊ณผ์ emp_no์ ๋์ผํ ๋ ์ฝ๋๋ฅผ ์ฐพ์์
3. E) filter // 2๋ฒ์ filterํ๊ณ ์ผ์นํ๋๊ฐ ๋ฝ๊ธฐ
4. C) Nested loop inner join // 1,3๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธํด์
5. B) aggregate using temporary table // ์์ํ
์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉฐ group by ์ง๊ณ
6. A) table scan on <temporary> // ์์ํ
์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
์คํ ๊ณํ ๋ถ์
id์นผ๋ผ
- select๋ณ๋ก ๋ถ์ฌ๋๋ id
- ์ ๊ทผ ์์๋ฅผ ์๋ฏธํ์ง๋ ์์
select_type ์นผ๋ผ
- ๊ฐ ๋จ์ select์ฟผ๋ฆฌ๊ฐ ์ด๋ค ํ์ ์ ์ฟผ๋ฆฌ์ธ์ง ํ์๋๋ ์นผ๋ผ
- simple : union์ด๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋จ์ํ select, ์ฟผ๋ฆฌ๊ฐ ์๋ฌด๋ฆฌ ๋ณต์กํด๋ ๋จ ํ๋(์ผ๋ฐ์ ์ผ๋ก ์ ์ผ ๋ฐ๊นฅ)
- primary : union์ด๋ ์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ณํ์์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ, ๋ง์ฐฌ๊ฐ์ง๋ก ๋จํ๋
- union : ์ ๋์จ์ผ๋ก ๊ฒฐํฉํ๋๋ ๋จ์ ์ ๋ ํธ ์ฟผ๋ฆฌ ๊ฐ์ด๋ฐ ์ฒซ ๋ฒ์งธ๋ฅผ ์ ์ธํ ๋ ๋ฒ์งธ ์ดํ ๋จ์์ ์ ๋ ํธ ์ฟผ๋ฆฌ์ ํ์ , ์ ๋์จ์ ์ฒซ๋ฒ์งธ ๋จ์ ์ ๋ ํธ์ ํ์ ์ union๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ค์ ๋ชจ์์ ์ ์ฅํ๋ ์์ํ ์ด๋ธ(derived)๊ฐ select_type์ผ๋ก ์ค์ ๋จ
- dependent union : union ํน์ union all๋ก ๊ฒฐํฉ๋ ๋จ์ ์ฟผ๋ฆฌ๊ฐ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ํด ์ํฅ์ ๋ฐ๋๊ฑธ ์๋ฏธ
- union result : union๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ํ ์ด๋ธ (์ค์ ์ฟผ๋ฆฌ์์ ๋จ์ ์ฟผ๋ฆฌ๊ฐ ์๋๊ธฐ์ ๋ณ๋์ id ์์)
explain
select emp_no from salaries where salary > 100000
unionย distinct
select emp_no from dept_emp where from_date > '2001-01-01'
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | salaries | ref | salary_index | salary_index | 4 | const | 100 | Using where |
| 2 | UNION | dept_emp | range | from_date_index | from_date_index | 3 | NULL | 200 | Using where |
| NULL | UNION RESULT | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary |
- subquery : from์ ์ด์ธ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ง์ ์๋ฏธ