๊ธ๋ก๋ฒ ๋์ฉ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ํฅ์์ํค๋ SQL ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ์ ์ ๋ง์คํฐํ์ธ์. ์ธ๋ฑ์ฑ, ์ฟผ๋ฆฌ ์ฌ์์ฑ ๋ฑ์ ๋ฐฐ์๋๋ค.
SQL ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ์ : ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋
์ค๋๋ ์ ๋ฐ์ดํฐ ์ค์ฌ ์ธ์์์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์์ฑ๊ณผ ๋น์ฆ๋์ค ์ฑ๊ณต์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ฆฌ๊ฒ ์คํ๋๋ SQL ์ฟผ๋ฆฌ๋ ์ฌ์ฉ์ ๋ถ๋ง, ์ธ์ฌ์ดํธ ์ง์ฐ, ์ธํ๋ผ ๋น์ฉ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ MySQL, PostgreSQL, SQL Server, Oracle๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์ ์ฉ ๊ฐ๋ฅํ ๋ค์ํ SQL ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ์ ์ ํ์ํ์ฌ, ๊ท๋ชจ๋ ์์น์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ต์ ์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํน์ ๊ตญ๊ฐ๋ ์ง์ญ ๊ดํ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋ณดํธ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ฒ ์ฌ๋ก์ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค.
SQL ์ฟผ๋ฆฌ ์ต์ ํ์ ๊ธฐ๋ณธ ์ดํด
ํน์ ๊ธฐ์ ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๊ธฐ๋ณธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฟผ๋ฆฌ ์ต์ ํ ํ๋ก๊ทธ๋จ์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ณ ์ต์์ ์คํ ๊ณํ์ ์ ํํ ๋ค์ ์คํํ๋ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค.
์ฟผ๋ฆฌ ์คํ ๊ณํ
์ฟผ๋ฆฌ ์คํ ๊ณํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ ๋ฐฉ์์ ๋ก๋๋งต์ ๋๋ค. ์คํ ๊ณํ์ ์ดํดํ๊ณ ๋ถ์ํ๋ ๊ฒ์ ๋ณ๋ชฉ ํ์๊ณผ ์ต์ ํ ์์ญ์ ์๋ณํ๋ ๋ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์คํ ๊ณํ์ ๋ณผ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค(์: MySQL ๋ฐ PostgreSQL์ `EXPLAIN`, SQL Server Management Studio์ "์์ ์คํ ๊ณํ ํ์", Oracle์ `EXPLAIN PLAN`).
์คํ ๊ณํ์์ ์ฐพ์์ผ ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์ฒด ํ ์ด๋ธ ์ค์บ: ์ผ๋ฐ์ ์ผ๋ก ๋นํจ์จ์ ์ด๋ฉฐ ํนํ ๋์ฉ๋ ํ ์ด๋ธ์์ ๊ทธ๋ ์ต๋๋ค. ์ด๋ ์ ์ ํ ์ธ๋ฑ์ค๊ฐ ๋ถ์กฑํจ์ ๋ํ๋ ๋๋ค.
- ์ธ๋ฑ์ค ์ค์บ: ์ ์ฒด ํ ์ด๋ธ ์ค์บ๋ณด๋ค ๋ซ์ง๋ง, ์ธ๋ฑ์ค ์ค์บ์ ์ ํ์ด ์ค์ํฉ๋๋ค. ์ค์บ ์ธ๋ฑ์ค๋ณด๋ค ์ํฌ ์ธ๋ฑ์ค๊ฐ ๋ ์ ํธ๋ฉ๋๋ค.
- ํ ์ด๋ธ ์กฐ์ธ: ์กฐ์ธ ์์์ ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ(์: ํด์ ์กฐ์ธ, ๋ณํฉ ์กฐ์ธ, ์ค์ฒฉ ๋ฃจํ)์ ์ดํดํ์ธ์. ์๋ชป๋ ์กฐ์ธ ์์๋ ์ฟผ๋ฆฌ ์๋๋ฅผ ๊ธ๊ฒฉํ ์ ํ์ํฌ ์ ์์ต๋๋ค.
- ์ ๋ ฌ: ์ ๋ ฌ ์์ ์ ํนํ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ํฌํจํ ๋ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํต๊ณ
์ฟผ๋ฆฌ ์ต์ ํ ํ๋ก๊ทธ๋จ์ ์คํ ๊ณํ์ ๋ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํต๊ณ์ ์์กดํฉ๋๋ค. ํต๊ณ๋ ๋ฐ์ดํฐ ๋ถํฌ, ์นด๋๋๋ฆฌํฐ, ํ ์ด๋ธ ๋ฐ ์ธ๋ฑ์ค ํฌ๊ธฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค๋๋๊ฑฐ๋ ๋ถ์ ํํ ํต๊ณ๋ ์ต์ ํ๋์ง ์์ ์คํ ๊ณํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํต๊ณ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ธ์:
- MySQL: `ANALYZE TABLE table_name;`
- PostgreSQL: `ANALYZE table_name;`
- SQL Server: `UPDATE STATISTICS table_name;`
- Oracle: `DBMS_STATS.GATHER_TABLE_STATS(ownname => 'schema_name', tabname => 'table_name');`
ํต๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์๋ํํ๋ ๊ฒ์ด ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค. ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์๋ ํต๊ณ ์์ง ์์ ์ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ SQL ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ์
์ด์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํน์ ๊ธฐ์ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ธ๋ฑ์ฑ ์ ๋ต
์ธ๋ฑ์ค๋ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๊ธฐ๋ฐ์ ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ ํํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ธ๋ฑ์ค๊ฐ ์ฝ๊ธฐ ์ฑ๋ฅ์ ํฅ์์ํค์ง๋ง, ์ธ๋ฑ์ค ์ ์ง ๊ด๋ฆฌ ์ค๋ฒํค๋๋ก ์ธํด ์ฐ๊ธฐ ์ฑ๋ฅ(์ฝ์ , ์ ๋ฐ์ดํธ, ์ญ์ )์ ์ํฅ์ ๋ฏธ์น ์ ์์์ ๊ธฐ์ตํ์ธ์.
์ธ๋ฑ์คํ ์ฌ๋ฐ๋ฅธ ์ด ์ ํ
`WHERE` ์ , `JOIN` ์กฐ๊ฑด, `ORDER BY` ์ ์ ์์ฃผ ์ฌ์ฉ๋๋ ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋์ธ์. ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฑ์ ์กฐ๊ฑด์: `=`์ ํจ๊ป ์ฌ์ฉ๋๋ ์ด์ ์ธ๋ฑ์ฑ์ ํ๋ฅญํ ํ๋ณด์ ๋๋ค.
- ๋ฒ์ ์กฐ๊ฑด์: `>`, `<`, `>=`, `<=`, `BETWEEN`๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ์ด๋ ์ข์ ํ๋ณด์ ๋๋ค.
- ๋ณตํฉ ์ธ๋ฑ์ค์ ์ ํ ์ด: ๋ณตํฉ ์ธ๋ฑ์ค์ ์ด ์์๊ฐ ์ค์ํฉ๋๋ค. ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ์ด์ด ์ ํ ์ด์ด์ด์ผ ํฉ๋๋ค.
์์: `order_id`, `customer_id`, `order_date`, `order_total` ์ด์ ๊ฐ์ง `orders` ํ ์ด๋ธ์ ๊ณ ๋ คํด ๋ณด์ธ์. `customer_id`์ `order_date`๋ก ์ฃผ๋ฌธ์ ์์ฃผ ์ฟผ๋ฆฌํ๋ ๊ฒฝ์ฐ, `(customer_id, order_date)`์ ๋ํ ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
```sql CREATE INDEX idx_customer_order_date ON orders (customer_id, order_date); ```
์ธ๋ฑ์ค ์ ํ
๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์ฌ๋ฌ ์ธ๋ฑ์ค ์ ํ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ๋ฐ ์ฟผ๋ฆฌ ํจํด์ ๋ฐ๋ผ ์ ์ ํ ์ธ๋ฑ์ค ์ ํ์ ์ ํํ์ธ์.
- B-ํธ๋ฆฌ ์ธ๋ฑ์ค: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ํ์ผ๋ก, ๋ฑ์ ๋ฐ ๋ฒ์ ์ฟผ๋ฆฌ์ ์ ํฉํฉ๋๋ค.
- ํด์ ์ธ๋ฑ์ค: ๋ฑ์ ๊ฒ์์ ํจ์จ์ ์ด์ง๋ง ๋ฒ์ ์ฟผ๋ฆฌ์๋ ์ ํฉํ์ง ์์ต๋๋ค(MEMORY ์คํ ๋ฆฌ์ง ์์ง์ด ์๋ MySQL๊ณผ ๊ฐ์ ์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅ).
- ์ ๋ฌธ ์ธ๋ฑ์ค: ํ ์คํธ ๋ฐ์ดํฐ ๊ฒ์์ฉ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค(์: ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ `LIKE` ์ฐ์ฐ์, MySQL์ `MATCH AGAINST`).
- ๊ณต๊ฐ ์ธ๋ฑ์ค: ์ง๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ ๋ฐ ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค(์: ๋ค๊ฐํ ๋ด์ ์ ์ฐพ๊ธฐ).
์ปค๋ฒ๋ง ์ธ๋ฑ์ค
์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง์กฑ์ํค๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ด์ ํฌํจํ๋ฏ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ ์ด๋ธ ์์ฒด์ ์ก์ธ์คํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ํน์ `customer_id`์ ๋ํด `order_id`์ `order_total`์ ๊ฒ์ํ๊ธฐ ์ํด `orders`๋ฅผ ์์ฃผ ์ฟผ๋ฆฌํ๋ ๊ฒฝ์ฐ, `(customer_id, order_id, order_total)`์ ๋ํ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๊ฐ ์ด์์ ์ผ ๊ฒ์ ๋๋ค.
```sql CREATE INDEX idx_customer_covering ON orders (customer_id, order_id, order_total); ```
์ธ๋ฑ์ค ์ ์ง ๊ด๋ฆฌ
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ธ๋ฑ์ค๋ ์กฐ๊ฐํ๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ํจ์จ์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ฌ๊ตฌ์ถํ๊ฑฐ๋ ์ฌ๊ตฌ์ฑํ์ญ์์ค.
- MySQL: `OPTIMIZE TABLE table_name;`
- PostgreSQL: `REINDEX TABLE table_name;`
- SQL Server: `ALTER INDEX ALL ON table_name REBUILD;`
- Oracle: `ALTER INDEX index_name REBUILD;`
2. ์ฟผ๋ฆฌ ์ฌ์์ฑ ๊ธฐ์
์ข ์ข ์ฟผ๋ฆฌ ์์ฒด๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์์ฑํจ์ผ๋ก์จ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
`SELECT *` ํผํ๊ธฐ
`SELECT` ๋ฌธ์์ ํ์ํ ์ด์ ํญ์ ์ง์ ํ์ญ์์ค. `SELECT *`๋ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ์ด์ ๊ฒ์ํ์ฌ I/O ๋ฐ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ฆ๊ฐ์ํต๋๋ค.
๋์ ์: `SELECT * FROM orders WHERE customer_id = 123;`
์ข์ ์: `SELECT order_id, order_date, order_total FROM orders WHERE customer_id = 123;`
`WHERE` ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ
์ฟผ๋ฆฌ์์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ์ญ์์ค. ์ด๋ ํ์ ๋จ๊ณ์์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ ์ค์ ๋๋ค.
์์: ๋ ํ ์ด๋ธ์ ์กฐ์ธํ ๋ค์ ํํฐ๋งํ๋ ๋์ , ์กฐ์ธํ๊ธฐ ์ ์ ๊ฐ ํ ์ด๋ธ์ ๊ฐ๋ณ์ ์ผ๋ก ํํฐ๋งํ์ธ์.
์ ํ ์์ผ๋์นด๋์ ํจ๊ป `LIKE` ์ฌ์ฉ ํผํ๊ธฐ
`LIKE '%pattern%'`์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด `LIKE 'pattern%'`์ ์ฌ์ฉํ๊ฑฐ๋ ์ ๋ฌธ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ญ์์ค.
๋์ ์: `SELECT * FROM products WHERE product_name LIKE '%widget%';`
์ข์ ์: `SELECT * FROM products WHERE product_name LIKE 'widget%';` (์ ์ ํ ๊ฒฝ์ฐ) ๋๋ ์ ๋ฌธ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ญ์์ค.
`COUNT(*)` ๋์ `EXISTS` ์ฌ์ฉํ๊ธฐ
ํ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ `EXISTS`๋ ์ผ๋ฐ์ ์ผ๋ก `COUNT(*)`๋ณด๋ค ํจ์จ์ ์ ๋๋ค. `EXISTS`๋ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ผ๋ฉด ์ฆ์ ๊ฒ์์ ์ค์งํ๋ ๋ฐ๋ฉด, `COUNT(*)`๋ ๋ชจ๋ ์ผ์นํ๋ ํ์ ๊ณ์ฐํฉ๋๋ค.
๋์ ์: `SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END FROM orders WHERE customer_id = 123;`
์ข์ ์: `SELECT CASE WHEN EXISTS (SELECT 1 FROM orders WHERE customer_id = 123) THEN 1 ELSE 0 END;`
(์ ์ ํ ๊ฒฝ์ฐ) `UNION` ๋์ `UNION ALL` ์ฌ์ฉํ๊ธฐ
`UNION`์ ์ค๋ณต ํ์ ์ ๊ฑฐํ๋ฉฐ, ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๊ณ ๋น๊ตํ๋ ์์ ์ ํ์๋ก ํฉ๋๋ค. ๊ฒฐ๊ณผ ์งํฉ์ด ์๋ก ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด, ์ด๋ฌํ ์ค๋ฒํค๋๋ฅผ ํผํ๊ธฐ ์ํด `UNION ALL`์ ์ฌ์ฉํ์ญ์์ค.
๋์ ์: `SELECT city FROM customers WHERE country = 'USA' UNION SELECT city FROM suppliers WHERE country = 'USA';`
์ข์ ์: `SELECT city FROM customers WHERE country = 'USA' UNION ALL SELECT city FROM suppliers WHERE country = 'USA';` (๊ณ ๊ฐ๊ณผ ๊ณต๊ธ์ ์ฒด ๊ฐ์ ๋์๊ฐ ์ค๋ณต๋์ง ์๋ ๊ฒฝ์ฐ)
์๋ธ์ฟผ๋ฆฌ vs. ์กฐ์ธ
๋ง์ ๊ฒฝ์ฐ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ์ฌ์์ฑํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ต์ ํ ํ๋ก๊ทธ๋จ์ด ํญ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์๋ ๊ฒ์ ์๋๋๋ค.
์์:
์๋ธ์ฟผ๋ฆฌ: `SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'Germany');`
์กฐ์ธ: `SELECT o.* FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.country = 'Germany';`
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๊ณ ๋ ค ์ฌํญ
์ ์ค๊ณ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค:
์ ๊ทํ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ทํํ๋ฉด ๋ฐ์ดํฐ ์ค๋ณต์ ์ค์ด๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋น์ ๊ทํ๋ ๋๋๋ก ์ฝ๊ธฐ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง, ์ ์ฅ ๊ณต๊ฐ ์ฆ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ผ๋ ๋๊ฐ๋ฅผ ์น๋ฅด๊ฒ ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์ ํ
์ด์ ์ ์ ํ ๋ฐ์ดํฐ ์ ํ์ ์ ํํ์ธ์. ๋ ์์ ๋ฐ์ดํฐ ์ ํ์ ์ฌ์ฉํ๋ฉด ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ์ด์ ๊ฐ์ด `INT` ๋ฒ์๋ฅผ ์ด๊ณผํ์ง ์์ ๊ฒฝ์ฐ `BIGINT` ๋์ `INT`๋ฅผ ์ฌ์ฉํ์ญ์์ค.
ํํฐ์ ๋
๋์ฉ๋ ํ ์ด๋ธ์ ํํฐ์ ๋ํ๋ฉด ํ ์ด๋ธ์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ผ๋ก ๋๋์ด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ ์ง, ๋ฒ์ ๋๋ ๋ชฉ๋ก๊ณผ ๊ฐ์ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ผ ํ ์ด๋ธ์ ํํฐ์ ๋ํ ์ ์์ต๋๋ค.
์์: ํน์ ๋ ์ง ๋ฒ์์ ๋ํ ๋ณด๊ณ ์์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด `order_date`๋ฅผ ๊ธฐ์ค์ผ๋ก `orders` ํ ์ด๋ธ์ ํํฐ์ ๋ํ์ญ์์ค.
4. ์ฐ๊ฒฐ ํ๋ง
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ค์ ํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋๋ค. ์ฐ๊ฒฐ ํ๋ง์ ๊ธฐ์กด ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ์ฌ ๊ฐ ์ฟผ๋ฆฌ์ ๋ํ ์ ์ฐ๊ฒฐ ์์ฑ ์ค๋ฒํค๋๋ฅผ ์ค์ ๋๋ค.
๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ ์ฐ๊ฒฐ ํ๋ง์ ์ง์ํฉ๋๋ค. ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ง์ ์ ์ ํ๊ฒ ๊ตฌ์ฑํ์ญ์์ค.
5. ์บ์ฑ ์ ๋ต
์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ค์์ ๊ณ ๋ คํด ๋ณด์ธ์:
- ์ฟผ๋ฆฌ ์บ์ฑ: ์์ฃผ ์คํ๋๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค.
- ๊ฐ์ฒด ์บ์ฑ: ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํฉ๋๋ค.
๋๋ฆฌ ์ฌ์ฉ๋๋ ์บ์ฑ ์๋ฃจ์ ์ผ๋ก๋ Redis, Memcached ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
6. ํ๋์จ์ด ๊ณ ๋ ค ์ฌํญ
๊ธฐ๋ฐ ํ๋์จ์ด ์ธํ๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ํฌ๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ค์์ ์ถฉ๋ถํ ํ๋ณดํ์ญ์์ค:
- CPU: ์ฟผ๋ฆฌ ์คํ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ.
- ๋ฉ๋ชจ๋ฆฌ: ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ์ ์ถฉ๋ถํ RAM.
- ์คํ ๋ฆฌ์ง: ๋น ๋ฅธ ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ์ํ ๋น ๋ฅธ ์คํ ๋ฆฌ์ง(์: SSD).
- ๋คํธ์ํฌ: ํด๋ผ์ด์ธํธ-์๋ฒ ํต์ ์ ์ํ ๊ณ ๋์ญํญ ๋คํธ์ํฌ ์ฐ๊ฒฐ.
7. ๋ชจ๋ํฐ๋ง ๋ฐ ํ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋๋ฆฌ๊ฒ ์คํ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ์ญ์์ค. ๋ค์์ ํฌํจํ ์ฃผ์ ์งํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค:
- ์ฟผ๋ฆฌ ์คํ ์๊ฐ: ์ฟผ๋ฆฌ ์คํ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ.
- CPU ์ฌ์ฉ๋ฅ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์ฌ์ฉํ๋ CPU ๋น์จ.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์.
- ๋์คํฌ I/O: ๋์คํฌ์์ ์ฝ๊ณ ์ฐ๋ ๋ฐ์ดํฐ ์.
๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ์์ญ์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ์ ํ๋ํ ์ ์์ต๋๋ค.
ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ณ ๋ ค ์ฌํญ
์์ ๊ธฐ์ ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ์ง๋ง, ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์์ฒด์ ์ธ ํน์ ๊ธฐ๋ฅ๊ณผ ํ๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
MySQL
- ์คํ ๋ฆฌ์ง ์์ง: ํ์์ ๋ฐ๋ผ ์ ์ ํ ์คํ ๋ฆฌ์ง ์์ง(์: InnoDB, MyISAM)์ ์ ํํ์ธ์. InnoDB๋ ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ํฌ๋ก๋์ ๋ ์ ํธ๋ฉ๋๋ค.
- ์ฟผ๋ฆฌ ์บ์: MySQL ์ฟผ๋ฆฌ ์บ์๋ `SELECT` ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ ์ ์์ต๋๋ค. ํ์ง๋ง MySQL์ ์ต์ ๋ฒ์ (8.0 ์ด์)์์๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ, ์ฐ๊ธฐ ์์ ์ด ๋ง์ ํ๊ฒฝ์์๋ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
- ๋๋ฆฐ ์ฟผ๋ฆฌ ๋ก๊ทธ: ์คํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ๊ธฐ ์ํด ๋๋ฆฐ ์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ํ์ฑํํ์ธ์.
PostgreSQL
- ์๋ VACUUM: PostgreSQL์ ์๋ VACUUM ํ๋ก์ธ์ค๋ ์ฃฝ์ ํํ์ ์๋์ผ๋ก ์ ๋ฆฌํ๊ณ ํต๊ณ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ญ์์ค.
- Explain Analyze: ์ฟผ๋ฆฌ์ ์ค์ ์คํ ํต๊ณ๋ฅผ ์ป์ผ๋ ค๋ฉด `EXPLAIN ANALYZE`๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- pg_stat_statements: `pg_stat_statements` ํ์ฅ์ ์ฟผ๋ฆฌ ์คํ ํต๊ณ๋ฅผ ์ถ์ ํฉ๋๋ค.
SQL Server
- SQL Server Profiler/ํ์ฅ ์ด๋ฒคํธ: ์ด ๋๊ตฌ๋ค์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์คํ์ ์ถ์ ํ๊ณ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง ํ๋ ์ด๋๋ฐ์ด์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง ํ๋ ์ด๋๋ฐ์ด์ ๋ ์ธ๋ฑ์ค ๋ฐ ๊ธฐํ ์ต์ ํ๋ฅผ ๊ถ์ฅํ ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ ์คํ ์ด: SQL Server ์ฟผ๋ฆฌ ์คํ ์ด๋ ์ฟผ๋ฆฌ ์คํ ๊ธฐ๋ก์ ์ถ์ ํ๊ณ ์ฑ๋ฅ ์ ํ๋ฅผ ์๋ณํ๊ณ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
Oracle
- ์๋ ์ํฌ๋ก๋ ์ ์ฅ์ (AWR): AWR์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ํต๊ณ๋ฅผ ์์งํ๊ณ ์ฑ๋ฅ ๋ถ์์ ์ํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- SQL ๊ฐ๋ฐ์: Oracle SQL ๊ฐ๋ฐ์๋ ์ฟผ๋ฆฌ ์ต์ ํ ๋ฐ ์ฑ๋ฅ ํ๋์ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์๋ SQL ํ๋ ์ด๋๋ฐ์ด์ : ์๋ SQL ํ๋ ์ด๋๋ฐ์ด์ ๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ SQL ํ๋กํ์ผ ๋ณ๊ฒฝ์ ๊ถ์ฅํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณ ๋ ค ์ฌํญ
์ฌ๋ฌ ์ง๋ฆฌ์ ์์ญ์ ๊ฑธ์ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ๋ ๋ค์์ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฐ์ดํฐ ๋ณต์ : ๋ฐ์ดํฐ ๋ณต์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ง์ญ์์ ๋ฐ์ดํฐ์ ๋ก์ปฌ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ญ์์ค. ์ด๋ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ํด๋น ์ง์ญ ์ฌ์ฉ์์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ์ฝ๊ธฐ ๋ณต์ ๋ณธ: ์ฝ๊ธฐ ํธ๋ํฝ์ ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ผ๋ก ๋ถ์ฐํ์ฌ ์ฃผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด์ญ์์ค.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ (CDN): CDN์ ์ฌ์ฉํ์ฌ ์ ์ ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น์ด ์บ์ํ์ญ์์ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๋ ์ด์ : ๋ฐ์ดํฐ์ ์ฌ์ฉ๋๋ ์ธ์ด ๋ฐ ๋ฌธ์ ์งํฉ์ ์ ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๋ ์ด์ ์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ ๋์ฝ๋ ์ฝ๋ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์๊ฐ๋: ๋ ์ง์ ์๊ฐ์ UTC๋ก ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์์ ํ์ง ์๊ฐ๋๋ก ๋ณํํ์ญ์์ค.
๊ฒฐ๋ก
SQL ์ฟผ๋ฆฌ ์ต์ ํ๋ ์ง์์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. ์ฟผ๋ฆฌ ์คํ์ ๊ธฐ๋ณธ์ ์ดํดํ๊ณ , ์ด ๊ฐ์ด๋์์ ๋ ผ์๋ ๊ธฐ์ ์ ์ ์ฉํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํจ์จ์ ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ ์ฌํญ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ต์ ํ ์ ๋ต์ ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ๊ณ ์กฐ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. SQL ์ฟผ๋ฆฌ ์ต์ ํ๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋น ๋ฅด๊ณ ๋ฐ์์ฑ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ๋น์ฆ๋์ค ์ฑ์ฅ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์ธํ๋ผ๊ฐ ํจ๊ณผ์ ์ผ๋ก ํ์ฅ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์คํํ๊ณ , ์คํ ๊ณํ์ ๋ถ์ํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ด ์ ๊ณตํ๋ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์ญ์์ค. ์ด๋ฌํ ์ ๋ต์ ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํํ๊ณ ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ํ ์คํธ ๋ฐ ์ธก์ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค.