μ§λ ν¬μ€ν μμ SQL νλ μ΄λ‘ μ λν΄ μ΄ν΄λ³΄μλλ°μ, μ΄λ² ν¬μ€ν μμλ μ€μ μ¬λ¬ ν μ΄λΈμ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ 쿼리μ λ¬Έμ μ μ νμ νκ³ , νλνμ¬ κ°μ ν΄ λ³΄κ² μ΅λλ€.
(μ€μ νλ μ SQL λ¬Έμ νμΈνμ¬ λ¬΄μμ΄ λ¬Έμ μΈμ§ νμ ν΄λ³΄κ³ , μ§μ κ°μ ν΄λ³΄κ³ νλ ν SQL λ¬Έμ νμΈνλ λ°©μλ μ’μ κ² κ°μ΅λλ€.)
μ μ± SQL νλμΌλ‘ μ΄λ³΄μ νμΆνκΈ°
μ€λ¬΄μ μΈ SQL νλ μ μ°¨ μ΄ν΄νκΈ°
1. SQL λ¬Έ μ€ν κ²°κ³Ό & νν© νμ
- κ²°κ³Ό λ° μμμκ° νμΈ
- μ‘°μΈ / μλΈμΏΌλ¦¬ ꡬ쑰
- λλ± / λ²μ 쑰건
2. κ°μμ
- ν μ΄λΈμ λ°μ΄ν° 건μ
- SELECT μ μ»¬λΌ λΆμ
- 쑰건μ μ»¬λΌ λΆμ
- 그루ν / μ λ ¬ 컬λΌ
3. λΉκ°μμ
- μ€νκ³ν
- μΈλ±μ€ νν©
- λ°μ΄ν° λ³κ²½ μΆμ΄
- μ 무μ νΉμ§
4. νλ λ°©ν₯ νλ¨ & κ°μ / μ μ© (ν μ€νΈ)
SQL λ¬Έ λ¨μ μμ μΌλ‘ μ°©ν 쿼리 λ§λ€κΈ°
μ λ°μ΄ν° μΈν μ μλ λ ν¬μ§ν 리μ sql νμΌμ ν΅ν΄ μ€μ ν μ μμ΅λλ€.
https://github.com/7ieon/SQLtune
ν μ΄λΈ λ°μ΄ν° 건μ
No | ν μ΄λΈ λͺ | λ°μ΄ν° 건μ |
1 | κΈμ¬ | 2,844,047 |
2 | λΆμ | 9 |
3 | λΆμκ΄λ¦¬μ | 24 |
4 | λΆμμ¬μ_맀ν | 331,603 |
5 | μ¬μ | 300,024 |
6 | μ¬μμΆμ κΈ°λ‘ | 660,000 |
7 | μ§κΈ | 443,308 |
ν μ΄λΈ μΈλ±μ€ λͺ©λ‘
ν μ΄λΈλͺ | ν€ μ ν | ν€λͺ | ν€_ꡬμ±μ΄ |
κΈμ¬ | PK | PRIMARY KEY | μ¬μλ²νΈ + μμμΌμ |
INDEX | I_μ¬μ©μ¬λΆ | μ¬μ©μ¬λΆ | |
λΆμ | PK | PRIMARY KEY | λΆμλ²νΈ |
UNIQUE INDEX | UI_λΆμλͺ | λΆμλͺ | |
λΆμκ΄λ¦¬μ | PK | PRIMARY KEY | μ¬μλ²νΈ + λΆμλ²νΈ |
INDEX | I_λΆμλ²νΈ | λΆμλ²νΈ | |
λΆμμ¬μ_맀ν | PK | PRIMARY KEY | μ¬μλ²νΈ + λΆμλ²νΈ |
INDEX | I_λΆμλ²νΈ | λΆμλ²νΈ | |
μ¬μ | PK | PRIMARY KEY | μ¬μλ²νΈ |
INDEX | I_μ μ¬μΌμ | μ μ¬μΌμ | |
INDEX | I_μ±λ³_μ± | μ±λ³ + μ± | |
μ¬μμΆμ κΈ°λ‘ | PK | PRIMARY KEY | μλ² + μ¬μλ²νΈ |
INDEX | I_μΆμ λ¬Έ | μΆμ λ¬Έ | |
INDEX | I_μ§μ | μ§μ | |
INDEX | I_μκ° | μ μΆμ μκ° | |
μ§κΈ | PK | PRIMARY KEY | μ¬μλ²νΈ + μ§κΈλͺ + μμμΌμ |
1. κΈ°λ³Έ ν€λ₯Ό λ³ννλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT *
FROM μ¬μ
WHERE SUBSTRING(μ¬μλ²νΈ, 1, 4) = 1100
AND LENGTH(μ¬μλ²νΈ) = 5;
- type = ALL μ΄λ―λ‘ ν μ€μΊ λ°©μμΌλ‘ μΈλ±μ€λ₯Ό μ¬μ©νμ§ μκ³ ν μ΄λΈμ λ°λ‘ μ κ·Ό ν©λλ€.
- μ¬μ ν μ΄λΈμ μ 체 λ°μ΄ν°κ° μ½ 30λ§κ±΄ μ΄λ―λ‘, κ±°μ λͺ¨λ λ°μ΄ν°μ μ κ·Όν©λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT *
FROM μ¬μ
WHERE μ¬μλ²νΈ BETWEEN 11000 AND 11009
- κΈ°λ³Έ ν€ (μ¬μλ²νΈ)λ₯Ό κ°κ³΅ μμ΄ λ²μ κ²μμ νμ©νμ¬ κΈ°λ³Έ ν€, μΈλ±μ€λ₯Ό νμ©ν©λλ€.
2. μ¬μ©νμ§ μλ ν¨μλ₯Ό ν¬ν¨νλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT IFNULL(μ±λ³, 'NO DATA') AS μ±λ³, COUNT(1) 건μ
FROM μ¬μ
GROUP BY IFNULL(μ±λ³, 'NO DATA');
- Extra νλͺ©μ΄ Using temporary μ΄λ―λ‘ μμ ν μ΄λΈμ μμ±ν©λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT μ±λ³, COUNT(1) 건μ
FROM μ¬μ
GROUP BY μ±λ³;
- Extra νλͺ©μ μμ ν μ΄λΈ(Using temporary) μμ΄ μΈλ±μ€λ§ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μΆμΆν©λλ€.
- λ¨, μ±λ³ 컬λΌμλ NOT NULLμ΄κ³ , NULL λ°μ΄ν°κ° μλ€λ κ°μ νμ νλν 쿼리μ λλ€.
3. νλ³νμΌλ‘ μΈλ±μ€λ₯Ό νμ©νμ§ λͺ»νλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT COUNT(1) FROM κΈμ¬ WHERE μ¬μ©μ¬λΆ = 1;
- filtered νλͺ©μ΄ 10μ΄λ―λ‘, MySQL μμ§μΌλ‘ κ°μ Έμ¨ λ°μ΄ν° μ€ 10%λ₯Ό μΆμΆν΄μ μ΅μ’ λ°μ΄ν°λ₯Ό μΆλ ₯ν¨μ μ μ μμ΅λλ€.
- rowsμ ν΄λΉνλ 2,838,398건μ λ°μ΄ν° μ€ 10%μ ν΄λΉνλ μ½ 3λ§ κ±΄μ λ°μ΄ν°κ° μ΅μ’ μΆλ ₯λ리λΌκ³ μμΈ‘ν μ μμ΅λλ€.
- λλ΅ 0.3μ΄
νλ ν SQL, μ€ν κ³ν
SELECT COUNT(1) FROM κΈμ¬ WHERE μ¬μ©μ¬λΆ = '1';
- μ¬μ©μ¬λΆ μ΄μ λ¬Έμν char(1) λ°μ΄ν° μ νμΌλ‘ ꡬμ±λμ΄μ, μ΄μ 쿼리μμλ μ«μ μ νμΌλ‘ μ¨μ λ°μ΄ν°μ μ κ·ΌνμΌλ―λ‘ DBMS λ΄λΆμ 묡μμ νλ³νμ΄ λ°μνκ³ , κ·Έ κ²°κ³Ό μΈλ±μ€λ₯Ό μ λλ‘ νμ©νμ§ λͺ»νκ³ μ 체 λ°μ΄ν°λ₯Ό μ€μΊνμμ΅λλ€.
- λλ΅ 0.02μ΄
μ€λΌν΄μ κ²½μ°, νΉμ λ²μ μ΄μ(?) μμλ μμ κ°μ λ¬Έμ κ° λ°μνμ§ μκ² μλμΌλ‘ νλ³νμ μ²λ¦¬ν΄μ£Όλ κΈ°λ₯μ΄ μμ΄μ μμ κ°μ λ¬Έμ κ° λ°μνμ§ μμλ κ²μΌλ‘ κΈ°μ΅μ νλλ°, νμ€νμ§λ μμ΅λλ€.
4. λ€μ 쿼리λ₯Ό UNION μ°μ°μλ‘λ§ ν©μΉλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT 'M' AS μ±λ³, μ¬μλ²νΈ
FROM μ¬μ
WHERE μ±λ³ = 'M'
AND μ± = 'Baba'
UNION
SELECT 'F' AS μ±λ³, μ¬μλ²νΈ
FROM μ¬μ
WHERE μ±λ³ = 'F'
AND μ± = 'Baba';
- idκ° 1, 2μΈ νμ μ¬μ ν μ΄λΈμ λν΄ I_μ±λ³_μ± μΈλ±μ€λ₯Ό νμ©ν©λλ€.
- idκ° 3μΈ νμ idκ° 1, 2μΈ νμ κ²°κ³Όλ₯Ό ν΅ν©νμ¬ μ€λ³΅μ μ κ±°νλ μμ μ ν©λλ€. μ¬κΈ°μ μμ ν μ΄λΈ(Using temporary)μ μμ±νκ³ κ·Έ λ΄λΆμμ κ° κ²°κ³Όμ UNION μ°μ° μμ μ μννλ¦¬λΌ μμΈ‘ν μ μμ΅λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT 'M' AS μ±λ³, μ¬μλ²νΈ
FROM μ¬μ
WHERE μ±λ³ = 'M'
AND μ± = 'Baba'
UNION ALL
SELECT 'F' AS μ±λ³, μ¬μλ²νΈ
FROM μ¬μ
WHERE μ±λ³ = 'F'
AND μ± = 'Baba';
- λ¨μν UNION -> UNION ALL μΌλ‘ λ³κ²½ν©λλ€.
- 첫 λ²μ§Έ SELECTμ λ λ²μ§Έ SELECTμ κ²°κ³Ό λ°μ΄ν°κ° μ€λ³΅λμ§ μμΌλ―λ‘, μ€λ³΅ μ κ±°νλ μμ μ΄ νμνμ§ μμ΅λλ€.
- νλ μ μ€ν κ³νκ³Όλ λ¬λ¦¬ μΈ λ²μ§Έ μΆκ° ν(Using temporary)μ νμνμ§ μμ΅λλ€.
5. μΈλ±μ€ κ³ λ € μμ΄ μ΄μ μ¬μ©νλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT μ±, μ±λ³, COUNT(*) AS μΉ΄μ΄νΈ
FROM μ¬μ
GROUP BY μ±, μ±λ³;
- I_μ±λ³_μ± μΈλ±μ€λ₯Ό νμ©νκ³ , μμ ν μ΄λΈ (Using temporary)μ μμ±νμ¬ μ±κ³Ό μ±λ³μ 그루νν΄ μΉ΄μ΄νΈ μ°μ°μ μνν©λλ€.
I_μ±λ³_μ± μΈλ±μ€λ μ±λ³κ³Ό μ± μμΌλ‘ μμ±λ μΈλ±μ€λ‘, μ±λ³ κΈ°μ€μΌλ‘ μ λ ¬λ λ€ μ± κΈ°μ€μΌλ‘ μ λ ¬λμμ΅λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT μ±, μ±λ³, COUNT(*) AS μΉ΄μ΄νΈ
FROM μ¬μ
GROUP BY μ±λ³, μ±;
- νλ ν μ€ν κ³νμμλ λ³λλ‘ μμ ν μ΄λΈμ μμ±νμ§ μκ³ λ μμ μ μνν©λλ€. (μΈλ±μ€ νμ©, μ±λ³ -> μ±)
- νλ μ μμ μκ°(0.3μ΄) -> νλ ν μμ μκ°(0.03μ΄)
6. λλ± μ‘°κ±΄μΌλ‘ μΈλ±μ€λ₯Ό μ¬μ©νλ λμ SQL λ¬Έ
νλ μ SQL, μ€ν κ³ν
SELECT * FROM μ¬μμΆμ
κΈ°λ‘ WHERE μΆμ
λ¬Έ = 'B';
- μΆμ λ¬Έ Bμ λν λͺ νν μμ 쑰건μΌλ‘ ref νλͺ©μ΄ constλ‘ μΆλ ₯λ©λλ€.
- νμ§λ§ μ¬μμΆμ κΈ°λ‘ ν μ΄λΈμ μ 체 λ°μ΄ν°(660,000) μ€ μΆμ λ¬Έμ΄ Bμ ν΄λΉνλ λ°μ΄ν°λ μ½ 50% (300,000)μ ν΄λΉνλ―λ‘, μ΄λ₯Ό μν΄ μΈλ±μ€λ₯Ό νμ©νλ κ² κ³Όμ° ν¨μ¨μ μΌμ§ κ³ λ―Όν΄λ΄μΌ ν©λλ€. (μΈλ±μ€ μμ΅λΆκΈ°μ )
νλ ν SQL, μ€ν κ³ν
SELECT * FROM μ¬μμΆμ
κΈ°λ‘ IGNORE INDEX(I_μΆμ
λ¬Έ) WHERE μΆμ
λ¬Έ = 'B';
- νλ ν μ€ν κ³νμ ν μ΄λΈ ν μ€μΊ(type: ALL)μΌλ‘ μνλ¨μ νμΈν μ μμ΅λλ€.
- μ¦, μΈλ±μ€λ₯Ό μ¬μ©νμ§ μμ μ± μ½ 66λ§κ±΄μ μ 체 λ°μ΄ν°λ₯Ό κ°μ Έμ 쑰건μ μ νμν λ°μ΄ν°λ₯Ό μΆμΆνλ λ°©μμΌλ‘, λλ€ μ‘μΈμ€κ° λ°μνμ§ μκ³ ν λ²μ λ€μμ νμ΄μ§μ μ κ·Όνλ ν μ΄λΈ ν μ€μΊ λ°©μμΌλ‘ μνλ©λλ€.
- μμ μκ°μ 3.5μ΄ -> 1.2μ΄λ‘ κ°μ
7. μμ ν μ΄λΈμ΄ λ¨Όμ μ‘°μΈμ μ°Έμ¬νλ(λλΌμ΄λΉ ν μ΄λΈ) λμ SQL λ¬Έ
λΆμ ν μ΄λΈ: 9건, λΆμμ¬μ_맀ν ν μ΄λΈ: 33λ§κ±΄
νλ μ SQL, μ€ν κ³ν
SELECT 맀ν.μ¬μλ²νΈ, λΆμ.λΆμλ²νΈ
FROM λΆμμ¬μ_맀ν 맀ν
JOIN λΆμ ON 맀ν.λΆμλ²νΈ = λΆμ.λΆμλ²νΈ
WHERE 맀ν.μμμΌμ >= '2002-03-01';
- λλΌμ΄λΉ ν μ΄λΈ(λΆμ), λλ¦¬λΈ ν μ΄λΈ(λΆμμ¬μ_맀ν) μ€μ²© 루ν μ‘°μΈμ μνν©λλ€.
- λΆμμ¬μ_맀ν ν μ΄λΈμ rows νλͺ©μ 40355 μμΉλ, SQL λ¬Έμ μννκ³ μ μ‘°μ¬ν νμ μμΈ‘ 건μλ‘, μΈλ±μ€ μ€μΊμ νκ³ λλ€ μ‘μΈμ€λ‘ ν μ΄λΈμ μ κ·Όνκ² λ©λλ€. λν MySQL μμ§μΌλ‘ κ°μ Έμ¨ λͺ¨λ λ°μ΄ν°μ λν΄ WHERE μ μ νν° μ‘°κ±΄ (μμμΌμ >= ...) μ μνν©λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT STRAIGHT_JOIN 맀ν.μ¬μλ²νΈ, λΆμ.λΆμλ²νΈ
FROM λΆμμ¬μ_맀ν 맀ν
JOIN λΆμ ON 맀ν.λΆμλ²νΈ = λΆμ.λΆμλ²νΈ
WHERE 맀ν.μμμΌμ >= '2002-03-01';
- μλμ μΌλ‘ κ·λͺ¨κ° ν° λΆμμ¬μ_맀ν ν μ΄λΈμ 맀ν.μμμΌμ >= '2002-03-01' 쑰건μ μ λ¨Όμ μ μ©νλ€λ©΄, μ‘°μΈν λ λΉκ΅ λμμ΄ μ€μ΄λ€ κ²μ λλ€. (ν΄λΉ λ°μ΄ν°λ μ½ 1300건)
- λΆμμ¬μ_맀ν ν μ΄λΈμ λ¨Όμ μ κ·Ό(λλΌμ΄λΉ)νμ¬ ν μ΄λΈ ν μ€μΊμΌλ‘ μ²λ¦¬νκ³ , λΆμ ν μ΄λΈμλ PKλ‘ μ κ·Όνμ¬ 1κ°μ λ°μ΄ν°λ§ μ κ·Όνλ μμΌλ‘ μνλ©λλ€.
- κ³ λ €ν΄μΌ ν μ μ, μμμΌμ μ΄μ΄ λ²μ 쑰건μΌλ‘ μμ±λλμ§, κ·Έ λ²μμ ν΄λΉνλ λ°μ΄ν°κ° μμμ μ€λͺ νλ μΈλ±μ€ μμ΅λΆκΈ°μ μ λκΈ°μ§ μλ μ λμ λΉμ¨μ΄λΌλ©΄ μΈλ±μ€λ₯Ό μμ±νλ κ²μ΄ λ ν¨μ¨μ μΌ μ μμ΅λλ€.
8. λ©μΈ ν μ΄λΈμ κ³μ μμ‘΄νλ λμ SQL λ¬Έ
μ¬μ ν μ΄λΈ: 30λ§κ±΄, κΈμ¬ ν μ΄λΈ: 280λ§κ±΄
νλ μ SQL, μ€ν κ³ν
SELECT μ¬μ.μ¬μλ²νΈ, μ¬μ.μ΄λ¦, μ¬μ.μ±
FROM μ¬μ
WHERE μ¬μλ²νΈ > 450000
AND (
SELECT MAX(μ°λ΄)
FROM κΈμ¬
WHERE μ¬μλ²νΈ = μ¬μ.μ¬μλ²νΈ
) > 100000;
- 1: μ¬μ ν μ΄λΈμ PKλ₯Ό νμ©νμ¬ λ²μ μ€μΊμ μνν©λλ€.
- 2: κΈμ¬ ν μ΄λΈμ μ κ·Όνλλ°, μΈλΆμ μ¬μ ν μ΄λΈλ‘λΆν° 쑰건μ μ μ λ¬λ°μ μνν΄μΌ νλ μμ‘΄μ±μ κ°μ§ μλΈμΏΌλ¦¬μ λλ€. κ·Έλ¦¬κ³ κΈμ¬ ν μ΄λΈμ PKλ₯Ό νμ©ν©λλ€.
π‘ λ³΄ν΅ μ€ν κ³νμ select_type νλͺ©μ DEPENDENTλΌλ ν€μλκ° μμΌλ©΄, μΈλΆ ν μ΄λΈμμ 쑰건μ μ λ°μ λ€ μ²λ¦¬λμ΄μΌ νλ―λ‘ νλ λμμΌλ‘ κ³ λ €ν μ μμ΅λλ€.
π‘ μλΈμΏΌλ¦¬ vs μ‘°μΈ
νμ κ²½νμ μλΈμΏΌλ¦¬λ³΄λ€λ μ‘°μΈμΌλ‘ μννλ νΈμ΄ μ±λ₯ μΈ‘λ©΄μμ μ 리ν κ°λ₯μ±μ΄ λμ΅λλ€.
νλ ν SQL, μ€ν κ³ν
SELECT μ¬μ.μ¬μλ²νΈ, μ¬μ.μ΄λ¦, μ¬μ.μ±
FROM μ¬μ JOIN κΈμ¬ ON μ¬μ.μ¬μλ²νΈ = κΈμ¬.μ¬μλ²νΈ
WHERE μ¬μ.μ¬μλ²νΈ > 450000
GROUP BY μ¬μ.μ¬μλ²νΈ
HAVING MAX(κΈμ¬.μ°λ΄) > 100000;
- WHERE μ μ μλΈμΏΌλ¦¬λ₯Ό μ‘°μΈμΌλ‘ λ³κ²½νμ¬ GROUP BY, HAVING μ μ ν΅ν΄ νλ μ κ·Έλ£Ήλ³ μ΅λκ°μ κ³μ°νλλ‘ κ°μ ν©λλ€.
- κΈμ¬ ν μ΄λΈμ DEPENDENT SUBQUERY λ°©μμ μ κ±°λκ³ , λ¨μ μ‘°μΈνλ λ°©μμΌλ‘ ν¨μ¨ ν₯μ
- rowsλ μμΈ‘κ°μ΄λ―λ‘ λ¨μν rows λ°μ΄ν°λ‘ νλ μ±κ³΅ μ¬λΆλ₯Ό νλ¨νκΈ°λ μ΄λ ΅μ΅λλ€.
μ¬λ¬ μν©μ λν΄ SQL νλμ μ§νν΄ λ³΄μλλ°μ, μ€μ λ‘ μΌμ νλ©΄μ λΉμ·ν μ¬λ‘λ₯Ό κ²ͺμλ μΌμ΄μ€λ μμκ³ , μ΄λ‘ μ μΌλ‘λ§ μκ³ μμλ λ΄μ©μ΄λ, μ ν λͺ°λλ λ΄μ©μ λν΄μλ νμ΅ν μ μμμ΅λλ€.
λ€μμ μ‘°κΈ λ μ€λ¬΄μ κ°κΉμ΄(?) 볡μ‘ν 쿼리λ₯Ό ν λλ‘ μΈλ±μ€ λ³κ²½, ν μ΄λΈ ꡬ쑰 λ³κ²½ λ° SQL μ¬μμ± λ± μΏΌλ¦¬ νλμ μνν μμ μ λλ€.
'CS > Database' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ 무μ λ°λ‘ μ°λ SQL νλ 1 - SQL νλ μ΄λ‘ (1) | 2024.10.07 |
---|---|
MySQL EXPLAIN μ€νκ³ν λ§μ€ν°νκΈ°(feat. RealMySQL 8.0) (0) | 2023.01.07 |
[Spring Data MongoDB] - Auto Increment Sequence μ΄κΈ°ννκΈ° (0) | 2021.09.11 |
[Spring Data MongoDB] Auto-Increment Sequence λ§λ€κΈ° (0) | 2021.09.10 |
[MySQL] - νΈλμμ μ 격리 μμ€(Isolation level) (11) | 2021.09.05 |
λκΈ