4์ฅ ์ ์ฑ SQL ํ๋์ผ๋ก ์ด๋ณด์ ํ์ถํ๊ธฐ
โ ๏ธ ๊ฐ ํ ์ด๋ธ๊ณผ ์ธ๋ฑ์ค๋ ์ฑ ์ ์ฐธ์กฐโ ๏ธ
์ฐธ๊ณ ์ฌํญ (3์ฅ ๋ด์ฉ)
(4์ฅ์ ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ต์ 3์ฅ์์ ์ด์ ๋๋ ์์์ผ ๋๋ค๊ณ ์๊ฐํด์ ๊ณต๋ถํ๊ณ ์์ฑํจ.)
์ฟผ๋ฆฌ ํ๋์ ๊ณ ๋ คํ ๋ ํ์ฌ ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ์คํ ๊ณํ์ ํตํด ์คํ๋๋์ง๋ฅผ ์์์ผ ํ๋ค.
EXPLAIN, DESCRIBE , DESC 3๊ฐ์ง ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ํ์ธํ ์ ์๋ค.
EXPLAIN SQL๋ฌธ;
DESCRIBE SQL๋ฌธ;
DESC SQL๋ฌธ;
-- EXPLAIN ์คํ๋ฌธ
EXPLAIN
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ. ์ฌ์.์ฑ, ๊ธ์ฌ.์ฐ๋ด,
(SELECT MAX(๋ถ์๋ฒํธ)
FROM ๋ถ์์ฌ์_๋งคํ as ๋งคํ WHERE ๋งคํ.์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ) ์นด์ดํธ
FROM ์ฌ์, ๊ธ์ฌ
WHERE ์ฌ์.์ฌ์๋ฒํธ = 10001
AND ์ฌ์.์ฌ์๋ฒํธ = ๊ธ์ฌ.์ฌ์๋ฒํธ;
-- EXPLAIN ์คํ ๊ฒฐ๊ณผ
id select_type table partitions type possible_keys
1 | PRIMARY | ์ฌ์ | NULL | const | PRIMARY |
1 | PRIMARY | ๊ธ์ฌ | NULL | ref | PRIMARY |
2 | DEPENDENT SUBQUERY | NULL | NULL | NULL | NULL |
key key_len ref rows filtered Extra
PRIMARY | 4 | const | 1 | 100.00 | NULL |
PRIMARY | 4 | const | 17 | 100.00 | NULL |
NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
id
์คํ ์์๋ฅผ ํ์.
ID์ ์ซ์๊ฐ ์์์๋ก ๋จผ์ ์ํ. ID๊ฐ ๊ฐ์ ๊ฐ์ด๋ผ๋ฉด ๋ ๊ฐ ํ ์ด๋ธ์ ์กฐ์ธ์ด ์ด๋ฃจ์ด์ง.
select_type
SQL ๋ฌธ์ ๊ตฌ์ฑํ๋ SELECT ๋ฌธ์ ์ ํ์ ํ์.
์๋ธ ์ฟผ๋ฆฌ๊ฐ ์๋ ๋จ์ SIMPLE, ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ๋ ์ฟผ๋ฆฌ์ ์ฃผ ์ฟผ๋ฆฌ, UNION ์ฟผ๋ฆฌ ๋ฑ์ ํ์.
table
ํ ์ด๋ธ ๋ช ์ ํ์
partitions
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ ผ๋ฆฌ์ ์ธ ์์ญ์ ํ์.
์ฌ์ ์ ์ ์ํ ํน์ ํํฐ์ ์ ์ ํ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ฑ๋ฅ์ด ์ข์.
๋ง์ฝ, ๋๋ฌด ๋ง์ ์์ญ์ ํํฐ์ ์ ์ ๊ทผํ๋ฉด ํํฐ์ ํ๋ ๊ณ ๋ ค.
type
ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฐพ์์ง์ ๊ดํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํญ๋ชฉ.
- system
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ํ๋๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ
- ์ฑ๋ฅ์ ์ต๊ณ
- const
- ์กฐํ๋๋ ๋ฐ์ดํฐ๊ฐ ๋จ 1๊ฑด์ผ๋
- ์ฑ๋ฅ ๋งค์ฐ ์ฐ์, ์งํฅํด์ผ ํ ํ์
- eq_ref
- ์กฐ์ธ์ด ์ํ๋ ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ๊ณ ์ ์ธ๋ฑ์ค ๋๋ ๊ธฐ๋ณธ ํค๋ก ๋จ 1๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋์ ํ์ .
- ์กฐ์ธ ์ํ์ ๊ฐ์ฅ ์ฑ๋ฅ ์ข์
- ref
- ์กฐ์ธ์ด ์ํ๋ ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ๊ทผ ๋ฒ์๊ฐ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
- ์ฆ, 1 : N ๊ด๊ณ์์ ๋ง์ด ๋ํ๋จ. ๋๋ ์ธ๋ฑ์ค ์ด์ ํตํ ๋น๊ต ์ฐ์ฐ์(< > =)์์๋ ๋ํ๋จ.
- ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ ๊ณ ๋ ค ๋จ.
- ref_or_null
- IS NULL ๊ตฌ๋ฌธ์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ์ต์ ํ ๋ฐฉ์
- NULL ๋ฐ์ดํฐ ์์ด ์ ๋ค๋ฉด ํจ์จ์ , ๋ฐ์ดํฐ ์์ด ๋ง๋ค๋ฉด ํ๋ ๋์.
- range
- ๋น๊ต์ฐ์ฐ์, BETWEEN, IN ์ฐ์ฐ์ ํตํ ๋ฒ์ ์ค์บ์ ์ํํ๋ ๋ฐฉ์.
- ์ค์บ ๋ฒ์๊ฐ ๋์ผ๋ฉด ์ฑ๋ฅ ์ ํ์ ์์ธ ํ๋ ๋์.
- fulltext
- ํ ์คํธ ๊ฒ์ ์ฒ๋ฆฌ๋ฅผ ์ํด Full Text Index ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ.
- index_merge
- ํน์ ํ ์ด๋ธ์ ์์ฑ๋ ๋ ๊ฐ ์ด์์ ์ธ๋ฑ์ค๊ฐ ๋ณํฉ๋์ด ๋์์ ์ ์ฉ๋๋ ๊ฒฝ์ฐ.
- index
- ์ธ๋ฑ์ค ํ ์ค์บ.
- ALL
- ํ ์ด๋ธ ํ ์ค์บ
- ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋, ์ตํฐ๋ง์ด์ ํ๋จ์ ์ธ๋ฑ์ค๊ฐ ๋นํจ์จ์ผ ๊ฒฝ์ฐ.
- ์ธ๋ฑ์ค ๋ณ๊ฒฝ & ์ถ๊ฐ๋ก ํ๋ ๊ฐ๋ฅ
- ์ ์ฒด ํ ์ด๋ธ์์ 10 ~ 20% ์ด์ ๋ถ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ ์คํ๋ ค ์ฑ๋ฅ์ ์ ๋ฆฌํ ์ ์์.
possible_keys
์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ํ์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค ๋ชฉ๋ก์ ์ถ๋ ฅ.
๋ค๋ง, ์ค์ ํด๋น ์ฟผ๋ฆฌ๋ฌธ ์คํ์ ์ฌ์ฉ๋ ์ธ๋ฑ์ค๊ฐ ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋ํ ๋ ๋ณ๋ก ๋์์ ์๋๋ค๊ณ ํ๋ค.
key
์ตํ๋ง์ด์ ๊ฐ ์ต์ ํ์ ์ฌ์ฉํ ๊ธฐ๋ณธ ํค ๋๋ ์ธ๋ฑ์ค๋ช ์ ์๋ฏธ.
๋นํจ์จ์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ ํน์ ์ธ๋ฑ์ค ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ํ๋ ๋์.
key_len
์ฌ์ฉ๋ ํค๋ณธ ํค ๋๋ ์ธ๋ฑ์ค์ byte ์.
ex) ์ฌ์ ๋ฒํธ(INT) + ๋ ์ง(VARCHAR(50) = 4 + (50 + 1) * 3 = 159
ref
์กฐ์ธ์ ์กฐ๊ฑด๋ฌธ
rows
SQL๋ฌธ ์ํ์์ ํด๋น ํ ์ด๋ธ์ ์ ๊ทผํ ๋ชจ๋ ๋ฐ์ดํฐ ์.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ๋ขฐ๋ ๋ถ๊ฐ๋ฅ.
๊ทธ๋ฌ๋, ํด๋น ๊ฒฐ๊ณผ๊ฐ ๋๋ฌด ํฌ๊ฒ ์ฐจ์ด๊ฐ ๋๋ค๋ฉด ๋ถํ์ํ ๋ฐ์ดํฐ์ ๋๋ฌด ๋ง์ด ์ ๊ทผํ๊ณ ๊ฐ์ ธ์จ๋ค๋ ๋ป. ํ๋ ๋์.
filtered
DB ์์ง์ ๋์ด์จ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ํํฐ๋ง ๋๋์ง์ ๋ํ ํผ์ผํธ ์์น.
ex) 100๊ฐ์ ๋ฐ์ดํฐ ๋์ด์ด, ๊ฒฐ๊ณผ 10๊ฐ โ filtered = 10.00
extra
SQL ๋ฌธ์ ์ด๋ป๊ฒ ์ํํ ๊ฒ์ธ์ง์ ๊ดํ ์ถ๊ฐ ์ ๋ณด๋ค์ ํ์.
์ข ๋ฅ๊ฐ ๊ฐ๋ง์. ์ฌ๋ฌ๊ฐ์ง ์ค๋ณต ์ถ๋ ฅ ๊ฐ๋ฅ. ๋ ๋ด๊ฐ ๋ง์ด ์ ํ ๊ฒ ๊ฐ์๊ฒ๋ง ์์ฑํ ์์
- Distinct
- DISTINCT , UNION ๊ตฌ๋ฌธ์ด ํฌํจ๋์ด ์ค๋ณต์ด ์ ๊ฑฐ๋์ด ์ ์ผํ ๊ฐ์ ์ฐพ์ ๋.
- Using where
- WHERE ์ ์ ํํฐ ์กฐ๊ฑด์ ์ฌ์ฉํ ๋.
- Using temporary
- ๋ฐ์ดํฐ์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๊ฒ ๋ค๋ ์๋ฏธ.
- GROUP BY , ORDER BY ์ ๋ ฌ ์์ ํน์ ์ค๋ณต ์ ๊ฑฐ ์์ ์ ์ฌ์ฉ.
- Using index
- ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์๊ณ ์ธ๋ฑ์ค๋ง ์ฝ์ด์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ. (Covering Index)
- ์ ์ ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ฐ์.
4.2 SQL ๋ฌธ ๋จ์ ์์ ์ผ๋ก ์ฐฉํ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ
ํ๋ ์ด์ ์ ์ฟผ๋ฆฌ์ ํ๋ ์ดํ์ ์ฟผ๋ฆฌ์ EXPLAIN ๋ฌธ์ ์ฌ์ฉํด์ ์ด๋ค์ ์ด ๋ณ๊ฒฝ๋์๋์ง ํ์ธํ๋ฉด์ ํ๋ฉด ๋์์ด ๋ง์ด ๋ฉ๋๋ค.
๊ธฐ๋ณธ ํค๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ SQL ๋ฌธ
-- ํค๋ณธ ํค๊ฐ ๋ณ๊ฒฝ๋์ด ๊ธฐ๋ณธ ํค ์ธ๋ฑ์ค ์ํ๋ ๊ฒฝ์ฐ
SELECT *
FROM ์ฌ์
WHERE SUBSTRING(์ฌ์๋ฒํธ, 1, 4) = 1100
AND LENGTH(์ฌ์๋ฒํธ) = 5;
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.23์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ BETWEEN 11000 AND 11009
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.00์ด
์ฌ์ฉํ์ง ์๋ ํจ์๋ฅผ ํฌํจํ๋ ๋์ SQL ๋ฌธ
-- NOT NULL ์ปฌ๋ผ์ IFNULL์ ์ฌ์ฉํด์ NULL Check ํ๋ ๊ฒฝ์ฐ
-- IFNULL () ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํด Using Temporary๋ก DB๋ด์ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด ์ฐ์ฐํ๋ ๊ณผ์ ์ถ๊ฐ๋จ
SELECT IFNULL(์ฑ๋ณ, 'NO DATA') AS ์ฑ๋ณ, COUNT(1) ๊ฑด์
FROM ์ฌ์
GROUP BY IFNULL(์ฑ๋ณ, 'NO DATA')
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.77์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฑ๋ณ, COUNT(1) ๊ฑด์
FROM ์ฌ์
GROUP BY ์ฑ๋ณ
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.10์ด
-- ์ฆ, ๋ฌด์๋ฏธํ ํจ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ์ง์ํ์.
ํ๋ณํ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํ๋ ๋์ SQL ๋ฌธ
-- ์ฌ๊ธฐ์ ์ฌ์ฉ์ฌ๋ถ ๋ผ๋ ์ปฌ๋ผ์ ํ์
์ VARCHAR(1) ์ด๋ค.
-- DB์์ ๋ฌต์์ ํ๋ณํ์ด ๋ฐ์ํ์ฌ ์ฌ์ฉ์ฌ๋ถ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํจ.
SELECT COUNT(1)
FROM ๊ธ์ฌ
WHERE ์ฌ์ฉ์ฌ๋ถ = 1;
-- ์ฝ 5๋ง๊ฑด ๋ฐ์ดํฐ 0.15์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT COUNT(1)
FROM ๊ธ์ฌ
WHERE ์ฌ์ฉ์ฌ๋ถ = '1'
-- ์ฝ 5๋ง๊ฑด ๋ฐ์ดํฐ 0.01์ด
์ด์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฑ๋ณ ๊ณผ ์ฑ์ ๋ฌถ์ด ๋์ ์ธ๋ฑ์ค๊ฐ ์ด๋ฏธ ์กด์ฌ.
-- ๊ทธ๋ฌ๋ CONCAT ์ฐ์ฐ์ ํตํด ์๋ก์ด ๋ฌธ์์ด์ด ๋์์ผ๋ฏ๋ก ํด๋น ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐ๋ฅ.
SELECT *
FROM ์ฌ์
WHERE CONCAT(์ฑ๋ณ, ' ', ์ฑ) = 'M Radwan'
--์ฝ 100๊ฑด์ ๋ฐ์ดํฐ ์ถ์ถ 0.25์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Radwan'
-- ๋์ผํ ๊ฒฐ๊ณผ 0.01์ด
์ต๊ด์ ์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋์ SQL๋ฌธ
-- ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ DISTINCT๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ๊ฑฐ๋ฅผ ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ.
SELECT DISTINCT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ, ๋ถ์๊ด๋ฆฌ์.๋ถ์๋ฒํธ
FROM ์ฌ์
JOIN ๋ถ์๊ด๋ฆฌ์
ON(์ฌ์.์ฌ์๋ฒํธ = ๋ถ์๊ด๋ฆฌ์.์ฌ์๋ฒํธ)
-- EXPLINE ์คํ ๊ณํ์์ type = eq_ref ๋ก ์ฌ์๋ฒํธ๋ผ๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํด์
-- ๋จ 1๊ฑด์ ๋ฐ์ดํฐ ์กฐํ๊ฐ ์ผ์ด๋๋ค๊ณ ํ์ธํ ์ ์์
-- DISTINCT ํค์๋๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ ๋ค ์ค๋ณต ์ ๊ฑฐํ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋จ.
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ, 1๊ฑด์ ๋ฐ์ดํฐ ์กฐํ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ด ์กด์ฌํ์ง ์์.
-- ์ฟผ๋ฆฌ ํ๋
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ด๋ฆ, ์ฑ, ๋ถ์๋ฒํธ
FROM ์ฌ์
JOIN ๋ถ์๊ด๋ฆฌ์
ON (์ฌ์.์ฌ์๋ฒํธ = ๋ถ์๊ด๋ฆฌ์.์ฌ์๋ฒํธ)
๋ค์ ์ฟผ๋ฆฌ๋ฅผ UNION ์ฐ์ฐ์๋ก๋ง ํฉ์น๋ ๋์ SQL ๋ฌธ
-- UNION ์ฐ์ฐ์ ๊ฒฝ์ฐ ๋๊ฐ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
-- ๊ทธ ๊ณผ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด์ ์ฐ์ฐ์ด ์งํ๋๋ค.
-- ๊ทธ๋ฌ๋, ํด๋น ์ฟผ๋ฆฌ์์๋ ์ค๋ณต์ ๋ํ ์ ๊ฑฐ๊ฐ ๋ถํ์ํ๋ค.
-- ๋ฐ๋ผ์, ๋จ์ํ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ์ฐ์ฐ์ ํ๋ UNION ALL์ ์ฌ์ฉํ๋ฉด ๋๋ค.
SELECT 'M' AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Baba'
UNION
SELECT 'F', AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'F'
AND ์ฑ = 'Baba'
-- ํ๋ ๊ฒฐ๊ณผ
SELECT 'M' AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Baba'
UNION ALL
SELECT 'F', AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'F'
AND ์ฑ = 'Baba'
์ธ๋ฑ์ค ๊ณ ๋ ค ์์ด ์ด์ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฑ๋ณ + ์ฑ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์กํ์๋ค.
-- ์ฆ, ์ฑ๋ณ์ ํตํด ์ ๋ ฌ์ด ๋ ํ ์ฑ์ผ๋ก ์ ๋ ฌ์ด ๋์ด์๋ค.
-- ์ด ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํตํด์๋ง ์กฐํ๊ฐ ๊ฐ๋ฅํ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ก ์ํ๋๋ค.
-- ๊ทธ๋ฌ๋, ์ฑ + ์ฑ๋ณ์ ๊ฒฝ์ฐ ์ ๋ ฌ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์์ ํ
์ด๋ธ์ ์์ฑํ์ฌ ๊ทธ๋ฃจํ๋๊ฒ ๋๋ค.
SELECT ์ฑ, ์ฑ๋ณ, COUNT(1) as ์นด์ดํธ
FROM ์ฌ์
GROUP BY ์ฑ, ์ฑ๋ณ
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฑ, ์ฑ๋ณ, COUNT(1) AS ์นด์ดํธ
FROM ์ฌ์
GROUP BY ์ฑ๋ณ, ์ฑ
์๋ฑํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฒ์ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋ณด์์๋ ์ด๊ฒ ๋ญ๊ฐ ๋ฌธ์ ์ธ๊ฑฐ์ง?
-- ๊ธฐ๋ณธ ํค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ๊ด์ฐฎ์๊ฑฐ ์๋๊ฐ??๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
-- ์ด 30๋ง๋ช
์ ์ฌ์์์ ์
์ฌ์ผ์๊ฐ 1989๋
์ธ ๊ฒฝ์ฐ๋ ์ด 2๋ง๊ฑด, ์ฌ์๋ฒํธ๊ฐ 10๋ง๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ 20๋ง๊ฑด์ด ์กด์ฌํ๋ค.
-- ์ด ๊ฒฝ์ฐ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ทผํ ๋ ์
์ฌ์ผ์๋ฅผ ํตํด ๋จผ์ ์ ๊ทผํ๋๊ฒ ๋ ๋ซ๋ค.
SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ LIKE '1989%'
AND ์ฌ์๋ฒํธ > 100000;
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ >= '1989-01-01' AND ์
์ฌ์ผ์ < '1990-01-01' USE INDEX(I_์
์ฌ์ผ์)
AND ์ฌ์๋ฒํธ > 100000;
-- 0.13์ด์ ๊ฒฐ๊ณผ๊ฐ 0.02
๋๋ฑ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ๊ฐ์ : ์ด 60๋ง๊ฑด ๋ฐ์ดํฐ, ๊ฒฐ๊ณผ๋ ์ด 30๋ง๊ฑด
-- ์คํ ๊ฒฐ๊ณผ ์ถ์
๋ฌธ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ค์บ์ผ๋ก ์ฝ 3.7์ด
-- ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 50%์ ๋ฌํ๋ ๋ฐ์ดํฐ ์กฐํ์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋๊ฒ ๋ ์ ์ข์ ์ํฉ์ด ์๋ค.
-- ์ ์ฒด ํ
์ด๋ธ์ 10 ~ 20% ๊ฐ ๋์ด๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ํ
์ด๋ธ ํ ์ค์บ์ด ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค.
SELECT *
FROM ์ฌ์์ถ์
๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'B'
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์์ถ์
๊ธฐ๋ก IGNORE INDEX(I_์ถ์
๋ฌธ)
WHERE ์ถ์
๋ฌธ = 'B'
-- ํ๋ ์คํ ๊ฒฐ๊ณผ 0.85์ด
๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ Index Range Scan ์ด๋ค. ๊ตณ.
-- ๊ทธ๋ฌ๋, ์ด 30๋ง๊ฑด์ ์ฌ์ ๋ฐ์ดํฐ์์ ํด๋น ๋ฒ์์ ๋ฐ์ดํฐ๋ ์ฝ 5๋ง๊ฑด์ด๋ค. ์คํ ์๊ฐ 1.21์ด
-- ์ด ๋ฐ์ดํฐ์ 17ํผ์ผํธ์ ํด๋น๋จ.
-- ์ด ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์ค์บ์ผ๋ก ๋๋ค ์ก์ธ์ค์ ๋ถํ๊ฐ ๋ฐ์ํ๋๋ก ํ๊ธฐ๋ณด๋ค๋
-- ํ
์ด๋ธ ํ ์ค์บ ๋ฐฉ์์ ๊ณ ์ ์ ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ๊ณ ๋ ค
SELECT ์ด๋ฆ, ์ฑ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d')
AND STR_TO_DATE('2000-12-31', '%Y-%m-%d')
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ด๋ฆ, ์ฑ
FROM ์ฌ์
WHERE YEAR(์
์ฌ์ผ์) BETWEEN '1994' AND '2000'
-- ์ธ๋ฑ์ค๋ฅผ ๋ฒ๋ฆฌ๊ณ ํ
์ด๋ธ ํ ์ค์บ. ์คํ ์๊ฐ 0.2์ด
์ ํ ์ด๋ธ ํ ์ค์บ์ด ๋ ํจ์จ์ ์ผ๊น?
๊ฐ์ : ์ ์ฒด ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ค ์๋น๋์ ๋ฐ์ดํฐ(10 ~ 20%๊ฐ ๋๋ ๋ฐ์ดํฐ)๋ฅผ ์ฐพ์์ค๋ ๊ฒฝ์ฐ.
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ.
์ธ๋ฑ์ค ์ค์บ์ผ๋ก ๋๋ค ์ก์ธ์ค์ ๋ถํ๊ฐ ๋ฐ์.
๋์คํฌ ์ค๋ฒํค๋ ์ฆ๊ฐ.
์ ์ฒด ๋ฐ์ดํฐ ์ค ๋ง์ ์์ ๋ฐ์ดํฐ์ ํ์ํ ์ธ๋ฑ์ค์ ์ ๊ทผ ํ ๋์คํฌ์ ์ ๊ทผํ๋ ๋น์ฉ.
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ ์ด๋ธ ํ ์ค์บ์ ํ๋ ๊ฒฝ์ฐ.
์ธ๋ฑ์ค๋ฅผ ํตํ ๋๋ค ์ก์ธ์ค๊ฐ ๋ฐ์ํ์ง ์์ ๋์คํฌ ์ค๋ฒํค๋๊ฐ ์ ์.
์ธ๋ฑ์ค์ ์ ๊ทผํ๋ค ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๊ณผ์ ์์ด, ๋ฐ๋ก ํ ์ด๋ธ์ ์ ๊ทผ.
ํ ์ด๋ธ ํ ์ค์บ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์์ด ํ ์ด๋ธ์ ์ง์ ์ ๊ทผํ๋ฉฐ ํ ๋ฒ์ ๋ค์์ ํ์ด์ง์ ์ ๊ทผํ๋ฏ๋ก ๋ ํจ์จ์ ์ธ SQL ๋ฌธ์ด ์คํ๋ ์ ์์.
4.3 ํ ์ด๋ธ ์กฐ์ธ ์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ฐฉํ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ
์์ ํ ์ด๋ธ์ด ๋จผ์ ์กฐ์ธ์ ์ฐธ์ฌํ๋ ๋์ SQL ๋ฌธ
-- ๊ฐ์ : ๋ถ์ = 9, ๋ถ์์ฌ์_๋งคํ = ์ฝ 30๋ง, ๋งคํ.์์์ผ์ >= '2002-03-01' = ์ฝ 1์ฒ 3๋ฐฑ = 0.4%,
-- ์ฝ 1์ฒ3๋ฐฑ์ ์คํ ๊ฒฐ๊ณผ 13.2์ด ์คํ์๊ฐ ์์.
-- ๋๋ผ์ด๋น ํ
์ด๋ธ = ๋ถ์, ๋๋ฆฌ๋ธ ํ
์ด๋ธ = ๋ถ์์ฌ์_๋งคํ. ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ ์คํ๋จ.
-- ์ฆ, ๋ถ์ 9๊ฐ ๊ฐ์ง๊ณ 30๋ง๊ฐ ๋๋ค ์ก์ธ์ค ํด์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ณ ๊ฑฐ๊ธฐ์ ํํฐ๋ง ์งํ.
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋๋ผ๋ ๋๋ฆฌ๋ธ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ ๊ฒ ๋ง์ ๊ฒฝ์ฐ ๋๋ค ์ก์ธ์ค ๋น์ฉ์ด ๋น์ธ๋ค.
-- ๊ทธ๋ ๋ค๋ฉด ์กฐ๊ฑด์ ์ ๋จผ์ ์ด์ฉํด์ ๋๋ฆฌ๋ธ ํ
์ด๋ธ ๋ฐ์ดํฐ 30๋ง -> 1์ฒ 3๋ฐฑ์ผ๋ก ์ค์ธ๋ค๋ฉด?
SELECT ๋งคํ.์ฌ์๋ฒํธ, ๋ถ์.๋ถ์๋ฒํธ
FROM ๋ถ์์ฌ์_๋งคํ ๋งคํ, ๋ถ์
WHERE ๋งคํ.๋ถ์๋ฒํธ = ๋ถ์.๋ถ์๋ฒํธ
AND ๋งคํ.์์์ผ์ >= '2002-03-01';
-- ํ๋ ๊ฒฐ๊ณผ
SELECT STRAIGHT_JOIN
๋งคํ.์ฌ์๋ฒํธ,
๋ถ์.๋ถ์๋ฒํธ
FROM ๋ถ์์ฌ์_๋งคํ ๋งคํ, ๋ถ์
WHERE ๋งคํ.๋ถ์๋ฒํธ = ๋ถ์.๋ถ์๋ฒํธ
AND ๋งคํ.์์์ผ์ >= '2002-03-01'
-- ์คํ๊ฒฐ๊ณผ 0.17์ด
-- ํ๋ ํ ์คํ ๊ณํ
-- ์๋์ ์ผ๋ก ๋์ฉ๋์ธ ๋ถ์์ฌ์_๋งคํ ํ
์ด๋ธ -> ํ
์ด๋ธ ํ ์ค์บ์ผ๋ก ์ฒ๋ฆฌ. Type: index -> ALL
-- ๋ถ์ ํ
์ด๋ธ -> ๊ธฐ๋ณธ ํค๋ก ๋ฐ๋ณต ์ ๊ทผ Type: ref -> eq_ref
๋ฉ์ธ ํ ์ด๋ธ์ ๊ณ์ ์์กดํ๋ ๋์ SQL ๋ฌธ
-- ๋ฉ์ธ์ธ ์ฌ์ ํ
์ด๋ธ๋ก๋ถํฐ ์กฐ๊ฑด์ ์ ๋ฌ๋ฐ์ ์ํํด์ผ ํ๋ ์์กด์ฑ์ ๊ฐ์ง ์๋ธ์ฟผ๋ฆฌ์ด๋ค.
-- select_type: DEPENDENTY SUBQUERY
-- ์คํ ๊ณํ์ select_type ํญ๋ชฉ์ DEPENDENT ๋ผ๋ ํค์๋๊ฐ ์์ผ๋ฉด,
-- ์ธ๋ถ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ์ ๋ฐ์ ๋ค ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฏ๋ก ํ๋ ๋์์ผ๋ก ๊ณ ๋ คํ ์ ์๋ค.
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ > 450000
AND ( SELECT MAX(์ฐ๋ด)
FROM ๊ธ์ฌ
WHERE ์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ
) > 100000;
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ > 450000
AND ์ฌ์.์ฌ์๋ํธ = ๊ธ์ฌ.์ฌ์๋ฒํธ
GROUP BY ์ฌ์.์ฌ์๋ฒํธ
HAVING MAX(๊ธ์ฌ.์ฐ๋ด) > 1000000
-- 0.57 -> 0.11์ด
์ ์์ ํ ์๋ธ์ฟผ๋ฆฌ vs ์กฐ์ธ
์ ์๋ 10๋ ๊ฒฝ๋ ฅ์ DBA ๋ผ๊ณ ํ๋ค.
์ ์์ ๊ทธ๊ฐ ๊ฒฝํ์ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค๋ ์กฐ์ธ์ผ๋ก ์ํํ๋ ํธ์ด ์ฑ๋ฅ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ํ๋ค.
๋ถํ์ํ ์กฐ์ธ์ ์ํํ๋ ๋์ SQL ๋ฌธ
-- ์คํ ์๊ฐ: 22.5์ด
-- ์ด ๊ฒฝ์ฐ ์ฌ์์
์ถ์๊ธฐ๋ก์์ ์ถ์
๋ฌธ A์ ๊ดํ ๊ธฐ๋ก์ด ์๋ ์ฌ์์ด ๋ช๋ช
์ธ์ง๋ง ์๋ฉด ๋๋ค.
-- ๋ฐ๋ผ์, ์ฌ์์ถ์
๊ธฐ๋ก๊ณผ ์กฐ์ธํ์ฌ EXIST ๊ตฌ๋ฌธ์ ํตํด ์ง๊ณํ๋ฉด ๋๋ค.
SELECT COUNT(DISTINCT ์ฌ์.์ฌ์๋ฒํธ) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์,
( SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'A'
)
WHERE ์ฌ์.์ฌ์๋ฒํธ = ๊ธฐ๋ก.์ฌ์๋ฒํธ
-- ํ๋ ๊ฒฐ๊ณผ
SELECT COUNT(1) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์
WHERE EXISTS (
SELECT 1
FROM ์ฌ์์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'A'
AND ๊ธฐ๋ก.์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ
)
-- ์คํ ์๊ฐ: 0.5์ด
FROM ์ ์๋ธ์ฟผ๋ฆฌ(์ธ๋ผ์ธ ๋ทฐ)๋ ์ตํฐ๋ง์ด์ ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋?
FROM ์ ์ ์ธ๋ผ์ธ ๋ทฐ๋ ์ตํฐ๋ง์ด์ ์ ์ํด ์กฐ์ธ ๋ฐฉ์์ด ๋ทฐ ๋ณํ(View Merging)์ผ๋ก ์ต์ ํ ๋์ด ์๋์ ๊ฐ์ด ์คํ๋๋ค.
SELECT COUNT(DISTINCT ๊ธฐ๋ก.์ฌ์๋ฒํธ) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์, ์ฌ์์
์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ฌ์.์ฌ์๋ฒํธ = ๊ธฐ๋ก.์ฌ์๋ฒํธ
AND ์ถ์
๋ฌธ = 'A'
'๐ ์ฑ > ์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋ 2์ฅ SQL ํ๋ ์ฉ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ (0) | 2025.01.30 |
---|---|
์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋ 1์ฅ MySQL๊ณผ MariaDB ๊ฐ์ (0) | 2024.11.03 |
4์ฅ ์ ์ฑ SQL ํ๋์ผ๋ก ์ด๋ณด์ ํ์ถํ๊ธฐ
โ ๏ธ ๊ฐ ํ ์ด๋ธ๊ณผ ์ธ๋ฑ์ค๋ ์ฑ ์ ์ฐธ์กฐโ ๏ธ
์ฐธ๊ณ ์ฌํญ (3์ฅ ๋ด์ฉ)
(4์ฅ์ ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ต์ 3์ฅ์์ ์ด์ ๋๋ ์์์ผ ๋๋ค๊ณ ์๊ฐํด์ ๊ณต๋ถํ๊ณ ์์ฑํจ.)
์ฟผ๋ฆฌ ํ๋์ ๊ณ ๋ คํ ๋ ํ์ฌ ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ์คํ ๊ณํ์ ํตํด ์คํ๋๋์ง๋ฅผ ์์์ผ ํ๋ค.
EXPLAIN, DESCRIBE , DESC 3๊ฐ์ง ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ํ์ธํ ์ ์๋ค.
EXPLAIN SQL๋ฌธ;
DESCRIBE SQL๋ฌธ;
DESC SQL๋ฌธ;
-- EXPLAIN ์คํ๋ฌธ
EXPLAIN
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ. ์ฌ์.์ฑ, ๊ธ์ฌ.์ฐ๋ด,
(SELECT MAX(๋ถ์๋ฒํธ)
FROM ๋ถ์์ฌ์_๋งคํ as ๋งคํ WHERE ๋งคํ.์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ) ์นด์ดํธ
FROM ์ฌ์, ๊ธ์ฌ
WHERE ์ฌ์.์ฌ์๋ฒํธ = 10001
AND ์ฌ์.์ฌ์๋ฒํธ = ๊ธ์ฌ.์ฌ์๋ฒํธ;
-- EXPLAIN ์คํ ๊ฒฐ๊ณผ
id select_type table partitions type possible_keys
1 | PRIMARY | ์ฌ์ | NULL | const | PRIMARY |
1 | PRIMARY | ๊ธ์ฌ | NULL | ref | PRIMARY |
2 | DEPENDENT SUBQUERY | NULL | NULL | NULL | NULL |
key key_len ref rows filtered Extra
PRIMARY | 4 | const | 1 | 100.00 | NULL |
PRIMARY | 4 | const | 17 | 100.00 | NULL |
NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
id
์คํ ์์๋ฅผ ํ์.
ID์ ์ซ์๊ฐ ์์์๋ก ๋จผ์ ์ํ. ID๊ฐ ๊ฐ์ ๊ฐ์ด๋ผ๋ฉด ๋ ๊ฐ ํ ์ด๋ธ์ ์กฐ์ธ์ด ์ด๋ฃจ์ด์ง.
select_type
SQL ๋ฌธ์ ๊ตฌ์ฑํ๋ SELECT ๋ฌธ์ ์ ํ์ ํ์.
์๋ธ ์ฟผ๋ฆฌ๊ฐ ์๋ ๋จ์ SIMPLE, ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ๋ ์ฟผ๋ฆฌ์ ์ฃผ ์ฟผ๋ฆฌ, UNION ์ฟผ๋ฆฌ ๋ฑ์ ํ์.
table
ํ ์ด๋ธ ๋ช ์ ํ์
partitions
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ ผ๋ฆฌ์ ์ธ ์์ญ์ ํ์.
์ฌ์ ์ ์ ์ํ ํน์ ํํฐ์ ์ ์ ํ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ฑ๋ฅ์ด ์ข์.
๋ง์ฝ, ๋๋ฌด ๋ง์ ์์ญ์ ํํฐ์ ์ ์ ๊ทผํ๋ฉด ํํฐ์ ํ๋ ๊ณ ๋ ค.
type
ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฐพ์์ง์ ๊ดํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํญ๋ชฉ.
- system
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ํ๋๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ
- ์ฑ๋ฅ์ ์ต๊ณ
- const
- ์กฐํ๋๋ ๋ฐ์ดํฐ๊ฐ ๋จ 1๊ฑด์ผ๋
- ์ฑ๋ฅ ๋งค์ฐ ์ฐ์, ์งํฅํด์ผ ํ ํ์
- eq_ref
- ์กฐ์ธ์ด ์ํ๋ ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ๊ณ ์ ์ธ๋ฑ์ค ๋๋ ๊ธฐ๋ณธ ํค๋ก ๋จ 1๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋์ ํ์ .
- ์กฐ์ธ ์ํ์ ๊ฐ์ฅ ์ฑ๋ฅ ์ข์
- ref
- ์กฐ์ธ์ด ์ํ๋ ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ๊ทผ ๋ฒ์๊ฐ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
- ์ฆ, 1 : N ๊ด๊ณ์์ ๋ง์ด ๋ํ๋จ. ๋๋ ์ธ๋ฑ์ค ์ด์ ํตํ ๋น๊ต ์ฐ์ฐ์(< > =)์์๋ ๋ํ๋จ.
- ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ ๊ณ ๋ ค ๋จ.
- ref_or_null
- IS NULL ๊ตฌ๋ฌธ์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ์ต์ ํ ๋ฐฉ์
- NULL ๋ฐ์ดํฐ ์์ด ์ ๋ค๋ฉด ํจ์จ์ , ๋ฐ์ดํฐ ์์ด ๋ง๋ค๋ฉด ํ๋ ๋์.
- range
- ๋น๊ต์ฐ์ฐ์, BETWEEN, IN ์ฐ์ฐ์ ํตํ ๋ฒ์ ์ค์บ์ ์ํํ๋ ๋ฐฉ์.
- ์ค์บ ๋ฒ์๊ฐ ๋์ผ๋ฉด ์ฑ๋ฅ ์ ํ์ ์์ธ ํ๋ ๋์.
- fulltext
- ํ ์คํธ ๊ฒ์ ์ฒ๋ฆฌ๋ฅผ ์ํด Full Text Index ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ.
- index_merge
- ํน์ ํ ์ด๋ธ์ ์์ฑ๋ ๋ ๊ฐ ์ด์์ ์ธ๋ฑ์ค๊ฐ ๋ณํฉ๋์ด ๋์์ ์ ์ฉ๋๋ ๊ฒฝ์ฐ.
- index
- ์ธ๋ฑ์ค ํ ์ค์บ.
- ALL
- ํ ์ด๋ธ ํ ์ค์บ
- ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋, ์ตํฐ๋ง์ด์ ํ๋จ์ ์ธ๋ฑ์ค๊ฐ ๋นํจ์จ์ผ ๊ฒฝ์ฐ.
- ์ธ๋ฑ์ค ๋ณ๊ฒฝ & ์ถ๊ฐ๋ก ํ๋ ๊ฐ๋ฅ
- ์ ์ฒด ํ ์ด๋ธ์์ 10 ~ 20% ์ด์ ๋ถ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ ์คํ๋ ค ์ฑ๋ฅ์ ์ ๋ฆฌํ ์ ์์.
possible_keys
์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ํ์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค ๋ชฉ๋ก์ ์ถ๋ ฅ.
๋ค๋ง, ์ค์ ํด๋น ์ฟผ๋ฆฌ๋ฌธ ์คํ์ ์ฌ์ฉ๋ ์ธ๋ฑ์ค๊ฐ ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋ํ ๋ ๋ณ๋ก ๋์์ ์๋๋ค๊ณ ํ๋ค.
key
์ตํ๋ง์ด์ ๊ฐ ์ต์ ํ์ ์ฌ์ฉํ ๊ธฐ๋ณธ ํค ๋๋ ์ธ๋ฑ์ค๋ช ์ ์๋ฏธ.
๋นํจ์จ์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ ํน์ ์ธ๋ฑ์ค ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ํ๋ ๋์.
key_len
์ฌ์ฉ๋ ํค๋ณธ ํค ๋๋ ์ธ๋ฑ์ค์ byte ์.
ex) ์ฌ์ ๋ฒํธ(INT) + ๋ ์ง(VARCHAR(50) = 4 + (50 + 1) * 3 = 159
ref
์กฐ์ธ์ ์กฐ๊ฑด๋ฌธ
rows
SQL๋ฌธ ์ํ์์ ํด๋น ํ ์ด๋ธ์ ์ ๊ทผํ ๋ชจ๋ ๋ฐ์ดํฐ ์.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ๋ขฐ๋ ๋ถ๊ฐ๋ฅ.
๊ทธ๋ฌ๋, ํด๋น ๊ฒฐ๊ณผ๊ฐ ๋๋ฌด ํฌ๊ฒ ์ฐจ์ด๊ฐ ๋๋ค๋ฉด ๋ถํ์ํ ๋ฐ์ดํฐ์ ๋๋ฌด ๋ง์ด ์ ๊ทผํ๊ณ ๊ฐ์ ธ์จ๋ค๋ ๋ป. ํ๋ ๋์.
filtered
DB ์์ง์ ๋์ด์จ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ํํฐ๋ง ๋๋์ง์ ๋ํ ํผ์ผํธ ์์น.
ex) 100๊ฐ์ ๋ฐ์ดํฐ ๋์ด์ด, ๊ฒฐ๊ณผ 10๊ฐ โ filtered = 10.00
extra
SQL ๋ฌธ์ ์ด๋ป๊ฒ ์ํํ ๊ฒ์ธ์ง์ ๊ดํ ์ถ๊ฐ ์ ๋ณด๋ค์ ํ์.
์ข ๋ฅ๊ฐ ๊ฐ๋ง์. ์ฌ๋ฌ๊ฐ์ง ์ค๋ณต ์ถ๋ ฅ ๊ฐ๋ฅ. ๋ ๋ด๊ฐ ๋ง์ด ์ ํ ๊ฒ ๊ฐ์๊ฒ๋ง ์์ฑํ ์์
- Distinct
- DISTINCT , UNION ๊ตฌ๋ฌธ์ด ํฌํจ๋์ด ์ค๋ณต์ด ์ ๊ฑฐ๋์ด ์ ์ผํ ๊ฐ์ ์ฐพ์ ๋.
- Using where
- WHERE ์ ์ ํํฐ ์กฐ๊ฑด์ ์ฌ์ฉํ ๋.
- Using temporary
- ๋ฐ์ดํฐ์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๊ฒ ๋ค๋ ์๋ฏธ.
- GROUP BY , ORDER BY ์ ๋ ฌ ์์ ํน์ ์ค๋ณต ์ ๊ฑฐ ์์ ์ ์ฌ์ฉ.
- Using index
- ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์๊ณ ์ธ๋ฑ์ค๋ง ์ฝ์ด์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ. (Covering Index)
- ์ ์ ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ฐ์.
4.2 SQL ๋ฌธ ๋จ์ ์์ ์ผ๋ก ์ฐฉํ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ
ํ๋ ์ด์ ์ ์ฟผ๋ฆฌ์ ํ๋ ์ดํ์ ์ฟผ๋ฆฌ์ EXPLAIN ๋ฌธ์ ์ฌ์ฉํด์ ์ด๋ค์ ์ด ๋ณ๊ฒฝ๋์๋์ง ํ์ธํ๋ฉด์ ํ๋ฉด ๋์์ด ๋ง์ด ๋ฉ๋๋ค.
๊ธฐ๋ณธ ํค๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ SQL ๋ฌธ
-- ํค๋ณธ ํค๊ฐ ๋ณ๊ฒฝ๋์ด ๊ธฐ๋ณธ ํค ์ธ๋ฑ์ค ์ํ๋ ๊ฒฝ์ฐ
SELECT *
FROM ์ฌ์
WHERE SUBSTRING(์ฌ์๋ฒํธ, 1, 4) = 1100
AND LENGTH(์ฌ์๋ฒํธ) = 5;
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.23์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ BETWEEN 11000 AND 11009
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.00์ด
์ฌ์ฉํ์ง ์๋ ํจ์๋ฅผ ํฌํจํ๋ ๋์ SQL ๋ฌธ
-- NOT NULL ์ปฌ๋ผ์ IFNULL์ ์ฌ์ฉํด์ NULL Check ํ๋ ๊ฒฝ์ฐ
-- IFNULL () ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํด Using Temporary๋ก DB๋ด์ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด ์ฐ์ฐํ๋ ๊ณผ์ ์ถ๊ฐ๋จ
SELECT IFNULL(์ฑ๋ณ, 'NO DATA') AS ์ฑ๋ณ, COUNT(1) ๊ฑด์
FROM ์ฌ์
GROUP BY IFNULL(์ฑ๋ณ, 'NO DATA')
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.77์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฑ๋ณ, COUNT(1) ๊ฑด์
FROM ์ฌ์
GROUP BY ์ฑ๋ณ
-- 30๋ง๊ฑด ๋ฐ์ดํฐ 0.10์ด
-- ์ฆ, ๋ฌด์๋ฏธํ ํจ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ์ง์ํ์.
ํ๋ณํ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํ๋ ๋์ SQL ๋ฌธ
-- ์ฌ๊ธฐ์ ์ฌ์ฉ์ฌ๋ถ ๋ผ๋ ์ปฌ๋ผ์ ํ์
์ VARCHAR(1) ์ด๋ค.
-- DB์์ ๋ฌต์์ ํ๋ณํ์ด ๋ฐ์ํ์ฌ ์ฌ์ฉ์ฌ๋ถ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํจ.
SELECT COUNT(1)
FROM ๊ธ์ฌ
WHERE ์ฌ์ฉ์ฌ๋ถ = 1;
-- ์ฝ 5๋ง๊ฑด ๋ฐ์ดํฐ 0.15์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT COUNT(1)
FROM ๊ธ์ฌ
WHERE ์ฌ์ฉ์ฌ๋ถ = '1'
-- ์ฝ 5๋ง๊ฑด ๋ฐ์ดํฐ 0.01์ด
์ด์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฑ๋ณ ๊ณผ ์ฑ์ ๋ฌถ์ด ๋์ ์ธ๋ฑ์ค๊ฐ ์ด๋ฏธ ์กด์ฌ.
-- ๊ทธ๋ฌ๋ CONCAT ์ฐ์ฐ์ ํตํด ์๋ก์ด ๋ฌธ์์ด์ด ๋์์ผ๋ฏ๋ก ํด๋น ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐ๋ฅ.
SELECT *
FROM ์ฌ์
WHERE CONCAT(์ฑ๋ณ, ' ', ์ฑ) = 'M Radwan'
--์ฝ 100๊ฑด์ ๋ฐ์ดํฐ ์ถ์ถ 0.25์ด
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Radwan'
-- ๋์ผํ ๊ฒฐ๊ณผ 0.01์ด
์ต๊ด์ ์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋์ SQL๋ฌธ
-- ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ DISTINCT๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ๊ฑฐ๋ฅผ ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ.
SELECT DISTINCT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ, ๋ถ์๊ด๋ฆฌ์.๋ถ์๋ฒํธ
FROM ์ฌ์
JOIN ๋ถ์๊ด๋ฆฌ์
ON(์ฌ์.์ฌ์๋ฒํธ = ๋ถ์๊ด๋ฆฌ์.์ฌ์๋ฒํธ)
-- EXPLINE ์คํ ๊ณํ์์ type = eq_ref ๋ก ์ฌ์๋ฒํธ๋ผ๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํด์
-- ๋จ 1๊ฑด์ ๋ฐ์ดํฐ ์กฐํ๊ฐ ์ผ์ด๋๋ค๊ณ ํ์ธํ ์ ์์
-- DISTINCT ํค์๋๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ ๋ค ์ค๋ณต ์ ๊ฑฐํ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋จ.
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ, 1๊ฑด์ ๋ฐ์ดํฐ ์กฐํ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ด ์กด์ฌํ์ง ์์.
-- ์ฟผ๋ฆฌ ํ๋
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ด๋ฆ, ์ฑ, ๋ถ์๋ฒํธ
FROM ์ฌ์
JOIN ๋ถ์๊ด๋ฆฌ์
ON (์ฌ์.์ฌ์๋ฒํธ = ๋ถ์๊ด๋ฆฌ์.์ฌ์๋ฒํธ)
๋ค์ ์ฟผ๋ฆฌ๋ฅผ UNION ์ฐ์ฐ์๋ก๋ง ํฉ์น๋ ๋์ SQL ๋ฌธ
-- UNION ์ฐ์ฐ์ ๊ฒฝ์ฐ ๋๊ฐ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
-- ๊ทธ ๊ณผ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด์ ์ฐ์ฐ์ด ์งํ๋๋ค.
-- ๊ทธ๋ฌ๋, ํด๋น ์ฟผ๋ฆฌ์์๋ ์ค๋ณต์ ๋ํ ์ ๊ฑฐ๊ฐ ๋ถํ์ํ๋ค.
-- ๋ฐ๋ผ์, ๋จ์ํ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ์ฐ์ฐ์ ํ๋ UNION ALL์ ์ฌ์ฉํ๋ฉด ๋๋ค.
SELECT 'M' AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Baba'
UNION
SELECT 'F', AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'F'
AND ์ฑ = 'Baba'
-- ํ๋ ๊ฒฐ๊ณผ
SELECT 'M' AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'M'
AND ์ฑ = 'Baba'
UNION ALL
SELECT 'F', AS ์ฑ๋ณ, ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์ฑ๋ณ = 'F'
AND ์ฑ = 'Baba'
์ธ๋ฑ์ค ๊ณ ๋ ค ์์ด ์ด์ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฑ๋ณ + ์ฑ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์กํ์๋ค.
-- ์ฆ, ์ฑ๋ณ์ ํตํด ์ ๋ ฌ์ด ๋ ํ ์ฑ์ผ๋ก ์ ๋ ฌ์ด ๋์ด์๋ค.
-- ์ด ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํตํด์๋ง ์กฐํ๊ฐ ๊ฐ๋ฅํ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ก ์ํ๋๋ค.
-- ๊ทธ๋ฌ๋, ์ฑ + ์ฑ๋ณ์ ๊ฒฝ์ฐ ์ ๋ ฌ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์์ ํ
์ด๋ธ์ ์์ฑํ์ฌ ๊ทธ๋ฃจํ๋๊ฒ ๋๋ค.
SELECT ์ฑ, ์ฑ๋ณ, COUNT(1) as ์นด์ดํธ
FROM ์ฌ์
GROUP BY ์ฑ, ์ฑ๋ณ
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฑ, ์ฑ๋ณ, COUNT(1) AS ์นด์ดํธ
FROM ์ฌ์
GROUP BY ์ฑ๋ณ, ์ฑ
์๋ฑํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ฒ์ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋ณด์์๋ ์ด๊ฒ ๋ญ๊ฐ ๋ฌธ์ ์ธ๊ฑฐ์ง?
-- ๊ธฐ๋ณธ ํค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ๊ด์ฐฎ์๊ฑฐ ์๋๊ฐ??๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
-- ์ด 30๋ง๋ช
์ ์ฌ์์์ ์
์ฌ์ผ์๊ฐ 1989๋
์ธ ๊ฒฝ์ฐ๋ ์ด 2๋ง๊ฑด, ์ฌ์๋ฒํธ๊ฐ 10๋ง๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ 20๋ง๊ฑด์ด ์กด์ฌํ๋ค.
-- ์ด ๊ฒฝ์ฐ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ทผํ ๋ ์
์ฌ์ผ์๋ฅผ ํตํด ๋จผ์ ์ ๊ทผํ๋๊ฒ ๋ ๋ซ๋ค.
SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ LIKE '1989%'
AND ์ฌ์๋ฒํธ > 100000;
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ >= '1989-01-01' AND ์
์ฌ์ผ์ < '1990-01-01' USE INDEX(I_์
์ฌ์ผ์)
AND ์ฌ์๋ฒํธ > 100000;
-- 0.13์ด์ ๊ฒฐ๊ณผ๊ฐ 0.02
๋๋ฑ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ๊ฐ์ : ์ด 60๋ง๊ฑด ๋ฐ์ดํฐ, ๊ฒฐ๊ณผ๋ ์ด 30๋ง๊ฑด
-- ์คํ ๊ฒฐ๊ณผ ์ถ์
๋ฌธ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ค์บ์ผ๋ก ์ฝ 3.7์ด
-- ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 50%์ ๋ฌํ๋ ๋ฐ์ดํฐ ์กฐํ์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋๊ฒ ๋ ์ ์ข์ ์ํฉ์ด ์๋ค.
-- ์ ์ฒด ํ
์ด๋ธ์ 10 ~ 20% ๊ฐ ๋์ด๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ํ
์ด๋ธ ํ ์ค์บ์ด ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค.
SELECT *
FROM ์ฌ์์ถ์
๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'B'
-- ํ๋ ๊ฒฐ๊ณผ
SELECT *
FROM ์ฌ์์ถ์
๊ธฐ๋ก IGNORE INDEX(I_์ถ์
๋ฌธ)
WHERE ์ถ์
๋ฌธ = 'B'
-- ํ๋ ์คํ ๊ฒฐ๊ณผ 0.85์ด
๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ SQL ๋ฌธ
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ Index Range Scan ์ด๋ค. ๊ตณ.
-- ๊ทธ๋ฌ๋, ์ด 30๋ง๊ฑด์ ์ฌ์ ๋ฐ์ดํฐ์์ ํด๋น ๋ฒ์์ ๋ฐ์ดํฐ๋ ์ฝ 5๋ง๊ฑด์ด๋ค. ์คํ ์๊ฐ 1.21์ด
-- ์ด ๋ฐ์ดํฐ์ 17ํผ์ผํธ์ ํด๋น๋จ.
-- ์ด ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์ค์บ์ผ๋ก ๋๋ค ์ก์ธ์ค์ ๋ถํ๊ฐ ๋ฐ์ํ๋๋ก ํ๊ธฐ๋ณด๋ค๋
-- ํ
์ด๋ธ ํ ์ค์บ ๋ฐฉ์์ ๊ณ ์ ์ ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ๊ณ ๋ ค
SELECT ์ด๋ฆ, ์ฑ
FROM ์ฌ์
WHERE ์
์ฌ์ผ์ BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d')
AND STR_TO_DATE('2000-12-31', '%Y-%m-%d')
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ด๋ฆ, ์ฑ
FROM ์ฌ์
WHERE YEAR(์
์ฌ์ผ์) BETWEEN '1994' AND '2000'
-- ์ธ๋ฑ์ค๋ฅผ ๋ฒ๋ฆฌ๊ณ ํ
์ด๋ธ ํ ์ค์บ. ์คํ ์๊ฐ 0.2์ด
์ ํ ์ด๋ธ ํ ์ค์บ์ด ๋ ํจ์จ์ ์ผ๊น?
๊ฐ์ : ์ ์ฒด ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ค ์๋น๋์ ๋ฐ์ดํฐ(10 ~ 20%๊ฐ ๋๋ ๋ฐ์ดํฐ)๋ฅผ ์ฐพ์์ค๋ ๊ฒฝ์ฐ.
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ.
์ธ๋ฑ์ค ์ค์บ์ผ๋ก ๋๋ค ์ก์ธ์ค์ ๋ถํ๊ฐ ๋ฐ์.
๋์คํฌ ์ค๋ฒํค๋ ์ฆ๊ฐ.
์ ์ฒด ๋ฐ์ดํฐ ์ค ๋ง์ ์์ ๋ฐ์ดํฐ์ ํ์ํ ์ธ๋ฑ์ค์ ์ ๊ทผ ํ ๋์คํฌ์ ์ ๊ทผํ๋ ๋น์ฉ.
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ ์ด๋ธ ํ ์ค์บ์ ํ๋ ๊ฒฝ์ฐ.
์ธ๋ฑ์ค๋ฅผ ํตํ ๋๋ค ์ก์ธ์ค๊ฐ ๋ฐ์ํ์ง ์์ ๋์คํฌ ์ค๋ฒํค๋๊ฐ ์ ์.
์ธ๋ฑ์ค์ ์ ๊ทผํ๋ค ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๊ณผ์ ์์ด, ๋ฐ๋ก ํ ์ด๋ธ์ ์ ๊ทผ.
ํ ์ด๋ธ ํ ์ค์บ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์์ด ํ ์ด๋ธ์ ์ง์ ์ ๊ทผํ๋ฉฐ ํ ๋ฒ์ ๋ค์์ ํ์ด์ง์ ์ ๊ทผํ๋ฏ๋ก ๋ ํจ์จ์ ์ธ SQL ๋ฌธ์ด ์คํ๋ ์ ์์.
4.3 ํ ์ด๋ธ ์กฐ์ธ ์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ฐฉํ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ
์์ ํ ์ด๋ธ์ด ๋จผ์ ์กฐ์ธ์ ์ฐธ์ฌํ๋ ๋์ SQL ๋ฌธ
-- ๊ฐ์ : ๋ถ์ = 9, ๋ถ์์ฌ์_๋งคํ = ์ฝ 30๋ง, ๋งคํ.์์์ผ์ >= '2002-03-01' = ์ฝ 1์ฒ 3๋ฐฑ = 0.4%,
-- ์ฝ 1์ฒ3๋ฐฑ์ ์คํ ๊ฒฐ๊ณผ 13.2์ด ์คํ์๊ฐ ์์.
-- ๋๋ผ์ด๋น ํ
์ด๋ธ = ๋ถ์, ๋๋ฆฌ๋ธ ํ
์ด๋ธ = ๋ถ์์ฌ์_๋งคํ. ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ ์คํ๋จ.
-- ์ฆ, ๋ถ์ 9๊ฐ ๊ฐ์ง๊ณ 30๋ง๊ฐ ๋๋ค ์ก์ธ์ค ํด์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ณ ๊ฑฐ๊ธฐ์ ํํฐ๋ง ์งํ.
-- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋๋ผ๋ ๋๋ฆฌ๋ธ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ ๊ฒ ๋ง์ ๊ฒฝ์ฐ ๋๋ค ์ก์ธ์ค ๋น์ฉ์ด ๋น์ธ๋ค.
-- ๊ทธ๋ ๋ค๋ฉด ์กฐ๊ฑด์ ์ ๋จผ์ ์ด์ฉํด์ ๋๋ฆฌ๋ธ ํ
์ด๋ธ ๋ฐ์ดํฐ 30๋ง -> 1์ฒ 3๋ฐฑ์ผ๋ก ์ค์ธ๋ค๋ฉด?
SELECT ๋งคํ.์ฌ์๋ฒํธ, ๋ถ์.๋ถ์๋ฒํธ
FROM ๋ถ์์ฌ์_๋งคํ ๋งคํ, ๋ถ์
WHERE ๋งคํ.๋ถ์๋ฒํธ = ๋ถ์.๋ถ์๋ฒํธ
AND ๋งคํ.์์์ผ์ >= '2002-03-01';
-- ํ๋ ๊ฒฐ๊ณผ
SELECT STRAIGHT_JOIN
๋งคํ.์ฌ์๋ฒํธ,
๋ถ์.๋ถ์๋ฒํธ
FROM ๋ถ์์ฌ์_๋งคํ ๋งคํ, ๋ถ์
WHERE ๋งคํ.๋ถ์๋ฒํธ = ๋ถ์.๋ถ์๋ฒํธ
AND ๋งคํ.์์์ผ์ >= '2002-03-01'
-- ์คํ๊ฒฐ๊ณผ 0.17์ด
-- ํ๋ ํ ์คํ ๊ณํ
-- ์๋์ ์ผ๋ก ๋์ฉ๋์ธ ๋ถ์์ฌ์_๋งคํ ํ
์ด๋ธ -> ํ
์ด๋ธ ํ ์ค์บ์ผ๋ก ์ฒ๋ฆฌ. Type: index -> ALL
-- ๋ถ์ ํ
์ด๋ธ -> ๊ธฐ๋ณธ ํค๋ก ๋ฐ๋ณต ์ ๊ทผ Type: ref -> eq_ref
๋ฉ์ธ ํ ์ด๋ธ์ ๊ณ์ ์์กดํ๋ ๋์ SQL ๋ฌธ
-- ๋ฉ์ธ์ธ ์ฌ์ ํ
์ด๋ธ๋ก๋ถํฐ ์กฐ๊ฑด์ ์ ๋ฌ๋ฐ์ ์ํํด์ผ ํ๋ ์์กด์ฑ์ ๊ฐ์ง ์๋ธ์ฟผ๋ฆฌ์ด๋ค.
-- select_type: DEPENDENTY SUBQUERY
-- ์คํ ๊ณํ์ select_type ํญ๋ชฉ์ DEPENDENT ๋ผ๋ ํค์๋๊ฐ ์์ผ๋ฉด,
-- ์ธ๋ถ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ์ ๋ฐ์ ๋ค ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฏ๋ก ํ๋ ๋์์ผ๋ก ๊ณ ๋ คํ ์ ์๋ค.
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ > 450000
AND ( SELECT MAX(์ฐ๋ด)
FROM ๊ธ์ฌ
WHERE ์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ
) > 100000;
-- ํ๋ ๊ฒฐ๊ณผ
SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ์ฌ์.์ฑ
FROM ์ฌ์
WHERE ์ฌ์๋ฒํธ > 450000
AND ์ฌ์.์ฌ์๋ํธ = ๊ธ์ฌ.์ฌ์๋ฒํธ
GROUP BY ์ฌ์.์ฌ์๋ฒํธ
HAVING MAX(๊ธ์ฌ.์ฐ๋ด) > 1000000
-- 0.57 -> 0.11์ด
์ ์์ ํ ์๋ธ์ฟผ๋ฆฌ vs ์กฐ์ธ
์ ์๋ 10๋ ๊ฒฝ๋ ฅ์ DBA ๋ผ๊ณ ํ๋ค.
์ ์์ ๊ทธ๊ฐ ๊ฒฝํ์ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค๋ ์กฐ์ธ์ผ๋ก ์ํํ๋ ํธ์ด ์ฑ๋ฅ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ํ๋ค.
๋ถํ์ํ ์กฐ์ธ์ ์ํํ๋ ๋์ SQL ๋ฌธ
-- ์คํ ์๊ฐ: 22.5์ด
-- ์ด ๊ฒฝ์ฐ ์ฌ์์
์ถ์๊ธฐ๋ก์์ ์ถ์
๋ฌธ A์ ๊ดํ ๊ธฐ๋ก์ด ์๋ ์ฌ์์ด ๋ช๋ช
์ธ์ง๋ง ์๋ฉด ๋๋ค.
-- ๋ฐ๋ผ์, ์ฌ์์ถ์
๊ธฐ๋ก๊ณผ ์กฐ์ธํ์ฌ EXIST ๊ตฌ๋ฌธ์ ํตํด ์ง๊ณํ๋ฉด ๋๋ค.
SELECT COUNT(DISTINCT ์ฌ์.์ฌ์๋ฒํธ) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์,
( SELECT ์ฌ์๋ฒํธ
FROM ์ฌ์์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'A'
)
WHERE ์ฌ์.์ฌ์๋ฒํธ = ๊ธฐ๋ก.์ฌ์๋ฒํธ
-- ํ๋ ๊ฒฐ๊ณผ
SELECT COUNT(1) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์
WHERE EXISTS (
SELECT 1
FROM ์ฌ์์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ถ์
๋ฌธ = 'A'
AND ๊ธฐ๋ก.์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ
)
-- ์คํ ์๊ฐ: 0.5์ด
FROM ์ ์๋ธ์ฟผ๋ฆฌ(์ธ๋ผ์ธ ๋ทฐ)๋ ์ตํฐ๋ง์ด์ ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋?
FROM ์ ์ ์ธ๋ผ์ธ ๋ทฐ๋ ์ตํฐ๋ง์ด์ ์ ์ํด ์กฐ์ธ ๋ฐฉ์์ด ๋ทฐ ๋ณํ(View Merging)์ผ๋ก ์ต์ ํ ๋์ด ์๋์ ๊ฐ์ด ์คํ๋๋ค.
SELECT COUNT(DISTINCT ๊ธฐ๋ก.์ฌ์๋ฒํธ) AS ๋ฐ์ดํฐ๊ฑด์
FROM ์ฌ์, ์ฌ์์
์ถ์
๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์ฌ์.์ฌ์๋ฒํธ = ๊ธฐ๋ก.์ฌ์๋ฒํธ
AND ์ถ์
๋ฌธ = 'A'
'๐ ์ฑ > ์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋ 2์ฅ SQL ํ๋ ์ฉ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ (0) | 2025.01.30 |
---|---|
์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋ 1์ฅ MySQL๊ณผ MariaDB ๊ฐ์ (0) | 2024.11.03 |