"SQL ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์. ์ค์ ํ๋ก์ ํธ์์ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ด๋ค ๋ฐฉ๋ฒ๋ค์ ์ ์ฉํด๋ณด์ จ๋์?"
-- MySQL์ ๊ฒฝ์ฐ
EXPLAIN SELECT * FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';
-- ์คํ๊ณํ ๋ถ์ ํฌ์ธํธ
- type ์ปฌ๋ผ: const, eq_ref, ref, range, index, ALL ๋ฑ์ ์ ๊ทผ ๋ฐฉ์ ํ์ธ
- key ์ปฌ๋ผ: ์ฌ์ฉ๋๋ ์ธ๋ฑ์ค ํ์ธ
- rows ์ปฌ๋ผ: ๊ฒ์๋๋ ํ ์ ์์ธก
-- ์์ข์ ์
SELECT * FROM orders
WHERE YEAR(created_at) = 2024; -- ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐ
-- ์ข์ ์
SELECT * FROM orders
WHERE created_at >= '2024-01-01'
AND created_at < '2025-01-01'; -- ์ธ๋ฑ์ค ์ฌ์ฉ ๊ฐ๋ฅ
-- ๋ณตํฉ ์ธ๋ฑ์ค ์์ฑ ์ ์ ํ๋(Selectivity)๊ฐ ๋์ ์ปฌ๋ผ์ ์์ ๋ฐฐ์น
CREATE INDEX idx_user_status_created
ON users(status, created_at); -- status๋ณด๋ค created_at์ ์ ํ๋๊ฐ ๋์ ๊ฒฝ์ฐ ์์ ๋ณ๊ฒฝ ๊ณ ๋ ค
-- ์ปค๋ฒ๋ง ์ธ๋ฑ์ค ํ์ฉ
SELECT user_id, status, created_at -- ์ธ๋ฑ์ค์ ํฌํจ๋ ์ปฌ๋ผ๋ง ์กฐํ
FROM users
WHERE status = 'active'
AND created_at > '2024-01-01';
-- ์์ ๊ฒฐ๊ณผ์
์ ๋จผ์ ์กฐ์ธ
SELECT * FROM small_table s -- 1000 rows
JOIN large_table l -- 1000000 rows
ON s.id = l.small_id;
-- ์กฐ์ธ ์กฐ๊ฑด ์ต์ ํ
SELECT * FROM orders o
JOIN users u ON u.id = o.user_id -- PK-FK ์กฐ์ธ
WHERE u.status = 'active';
-- ์์ข์ ์ (์๊ด ์๋ธ์ฟผ๋ฆฌ)
SELECT *,
(SELECT COUNT(*) FROM orders o
WHERE o.user_id = u.id) as order_count
FROM users u;
-- ์ข์ ์ (์กฐ์ธ์ผ๋ก ๋ณํ)
SELECT u.*, COALESCE(o.order_count, 0) as order_count
FROM users u
LEFT JOIN (
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
) o ON u.id = o.user_id;
-- ๋ฒ์ ํํฐ์
๋ ์์
CREATE TABLE orders (
id INT,
created_at DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
-- PostgreSQL์ ๊ฒฝ์ฐ
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT
DATE_TRUNC('month', created_at) as month,
SUM(amount) as total_sales
FROM orders
GROUP BY DATE_TRUNC('month', created_at)
WITH DATA;
- "High Performance MySQL" by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko
- "SQL Performance Explained" by Markus Winand
-- ์ฒ๋ฆฌ ์
DELETE FROM logs WHERE created_at < '2023-01-01';
-- ์ฒ๋ฆฌ ํ (๋ฐฐ์น ์ฒ๋ฆฌ)
REPEAT
DELETE FROM logs
WHERE created_at < '2023-01-01'
LIMIT 10000;
SLEEP(0.1);
UNTIL ROW_COUNT() = 0 END REPEAT;
-- ์ฒ๋ฆฌ ์
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE status = 'active'
);
-- ์ฒ๋ฆฌ ํ
SELECT o.*
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.status = 'active';
-- ์ฒ๋ฆฌ ์
SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id;
-- ์ฒ๋ฆฌ ํ (์ธ๋ฑ์ค ํ์ฉ)
CREATE INDEX idx_user_id ON orders(user_id);
SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id;
์ค์ ๋ฉด์ ์์๋ ์ด๋ฌํ ์ด๋ก ์ ์ธ ๋ด์ฉ๊ณผ ํจ๊ป, ๋ณธ์ธ์ด ์ค์ ํ๋ก์ ํธ์์ ๊ฒฝํํ ์ฑ๋ฅ ๊ฐ์ ์ฌ๋ก๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด:
- ๋ฌธ์ ์ํฉ ์ค๋ช
- ์์ธ ๋ถ์ ๊ณผ์
- ํด๊ฒฐ ๋ฐฉ๋ฒ ์ ์ฉ
- ์ฑ๋ฅ ๊ฐ์ ๊ฒฐ๊ณผ
์ด๋ฌํ ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ์ ๊ณต์ ํ๋ฉด ์ค๋ฌด ๋ฅ๋ ฅ์ ํจ๊ณผ์ ์ผ๋ก ์ดํํ ์ ์์ต๋๋ค.