์ธ๋ฑ์ค๋?
์ธ๋ฑ์ค(Index)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๊ฒ์ ์๋๋ฅผ ํฅ์ํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์์ธ์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ธ๋ฑ์ค๋ ์ฃผ๋ก WHERE ์กฐ๊ฑด์ ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์์ฑ๋ฉ๋๋ค.
์ธ๋ฑ์ค๋ B-ํธ๋ฆฌ(B-tree)๋ ํด์ ํ ์ด๋ธ(hash table)๋ก ๊ตฌํํ ์ ์์ง๋ง, ๋๋ถ๋ถ์ DBMS์์๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๋๋ฌธ์ B-ํธ๋ฆฌ๋ฅผ ์ธ๋ฑ์ค ์๋ฃ๊ตฌ์กฐ๋ก ์ฌ์ฉํฉ๋๋ค.
- ํญ์ ์ ๋ ฌ๋ ์ํ๋ก ํน์ ๊ฐ๋ณด๋ค ํฌ๊ณ ์์ ๋ถ๋ฑํธ ์ฐ์ฐ์ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ฐธ์กฐ ํฌ์ธํฐ๊ฐ ์ ์ด ๋ฐฉ๋ํ ๋ฐ์ดํฐ ์์๋ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฐ์ดํฐ ํ์๋ฟ ์๋๋ผ, ์ ์ฅ, ์์ , ์ญ์ ์๋ ํญ์ O(logN)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๋ณดํต INDEX๋ฅผ ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ์ ํ ๊ฐ ์ด์์ ์ฃผ๋ฉด Index Table์ด ๋ฐ๋ก ๋ง๋ค์ด์ง๋๋ฐ, ์ด Index Table์๋ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๋ก์ฐ๊ฐ๊ณผ rowid ๊ฐ์ด ์ ์ฅ๋๊ฒ ๋๋ฉฐ ๋ก์ฐ์ ๊ฐ์ ์ ๋ ฌ๋ B-TREE ๊ตฌ์กฐ๋ก ์ ์ฅ์์ผ ๋์ด ๋ ๋น ๋ฅด๊ฒ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ฐ ๋์์ ์ค๋๋ค.
ํ์ง๋ง UPDATE, INSERT, DELETE์์ ์๋๊ฐ ๋๋ ค์ง๋ค๋ ๋จ์ ์ด ์๋๋ฐ, ์ด ์ธ ๊ฐ์ง๋ ์๋ณธํ
์ด๋ธ์ ๋ฌผ๋ก INDEX TABLE์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ์์ผ ์ค์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ธ๋ฑ์ค๋ฅผ ํ์ง ์๋ ๋ํ์ ์ธ ์ฟผ๋ฆฌ๋ค
- ํจ์๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- LIKE๋ฌธ ๊ฒ์์์ ์์ผ๋์นด๋์ ์์น
- OR์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- NULL ๊ฐ์ ๋น๊ตํ๋ ๊ฒฝ์ฐ
- ํ ์ด๋ธ ์ ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
- ์ปฌ๋ผ์ ์๋ฃํ์ด ๋ค๋ฅธ ๊ฒ์์ ํ๋ ๊ฒฝ์ฐ
- IN ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒ์์์ IN ๋ชฉ๋ก์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ
1. ํจ์๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
SELECT * FROM table_name WHERE UPPER(name) = 'AHN'; -- ์ธ๋ฑ์ค ํ์ฉX
SELECT * FROM table_name WHERE YEAR(date_column) = 2023; -- ์ธ๋ฑ์ค ํ์ฉX
SELECT * FROM table_name WHERE column_name + 1 = 100; -- ์ธ๋ฑ์ค ํ์ฉX
๋ํ์ ์ผ๋ก ์์ ๊ฐ์ ์์๋ค์ฒ๋ผ ์ธ๋ฑ์ค๊ฐ ์๋ ์ด์ ํจ์ ๋๋ ์ฐ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค. ์ด๋ ์ธ๋ฑ์ค์ ๋์ ๋ฐฉ์๊ณผ ํจ์๋ ์ฐ์ฐ์์ ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ๋ฑ์ค๋ ํค์ ์์๋๋ก ์ ๋ ฌ๋์ด ์ ์ฅ๋๋ฉฐ, ๊ฒ์ ์์๋ B-ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ฒ์ํฉ๋๋ค. ํ์ง๋ง ํจ์๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒ์ ๋์ ๋ฐ์ดํฐ์ ๋ํ ๋ณํ์ ์ํํ๋ฏ๋ก, ์ธ๋ฑ์ค์ ์์์ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ค์บํ์ฌ ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ธฐ์ ์ฟผ๋ฆฌ์ ์๋๊ฐ ๋๋ ค์ง๊ฒ ๋ฉ๋๋ค.
2. LIKE๋ฌธ ๊ฒ์์์ ์์ผ๋์นด๋์ ์์น
SELECT * FROM table_name WHERE name LIKE 'A%'; -- ์ธ๋ฑ์ค ํ์ฉO
SELECT * FROM table_name WHERE name LIKE '%A'; -- ์ธ๋ฑ์ค ํ์ฉX
SELECT * FROM table_name WHERE name LIKE '%A%'; -- ์ธ๋ฑ์ค ํ์ฉX
์์ ๊ฐ์ด LIKE ์ ์์ %๊ฐ ๋ค์ ์๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ง๋ง, %๊ฐ ์์ด๋ ์ค๊ฐ์ ์์ ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ด์ ๋ ์ธ๋ฑ์ค์ B-ํธ๋ฆฌ ๊ตฌ์กฐ์ LIKE ์ ์ ๊ฒ์ ํจํด์ด ์ผ์นํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด์ ์ ๊ฐ๋จํ ๋งํ์ง๋ง ์ธ๋ฑ์ค๋ ์ผ๋ฐ์ ์ผ๋ก B-ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌ๋ ํค๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ %๊ฐ ๋ค์ ์์ ๊ฒฝ์ฐ๋ ๋ฌธ์์ด ์ ๋ ฌ ์์๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ ์ ์์ด์ ์ธ๋ฑ์ค๋ฅผ ํ์ง๋ง, ๋ฐ๋์ ๊ฒฝ์ฐ๋ ์ ๋ ฌ ์์๋ฅผ ํ์ฉํ์ง ๋ชปํด ์ธ๋ฑ์ค๋ฅผ ํ์ง ์์ต๋๋ค.
3. OR ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
SELECT * FROM table_name WHERE name = 'Ahn' OR age = 26; -- ์ธ๋ฑ์ค ํ์ฉX
OR์ ์ ์ฌ์ฉํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋๋ฐ, ์ด๋ OR์ ์ด ๋ ๊ฐ ์ด์์ ํ๋๋ฅผ ๋์์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ ์ด๋ฆ์ด 'Ahn'์ด๊ฑฐ๋ ๋์ด๊ฐ 26์ธ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ค์บํฉ๋๋ค.
๋ ์์ธํ๋ OR ์ ์ ์ฌ๋ฌ ๊ฐ์ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ์ ์ฒด ์กฐ๊ฑด์ ์ฐธ์ผ๋ก ํ๋จํฉ๋๋ค. ์ด ๋ง์ OR ์ ์ด ์ฌ์ฉ๋ ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์กฐ๊ฑด์ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ๊ฒ์ฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ต์ ์ OR ์กฐ๊ฑด์ ๋ฝ๊ธฐ ํ๋ค์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ์๋ OR ์ ๋์ ์ UNION ALL ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
4. NULL ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
SELECT * FROM table_name WHERE name = NULL; -- ์ธ๋ฑ์ค ํ์ฉX
SELECT * FROM table_name WHERE age IS NULL; -- ์ธ๋ฑ์ค ํ์ฉX
SELECT * FROM table_name WHERE age > 0; -- ์ธ๋ฑ์ค ํ์ฉO
NULL ๊ฐ์ ๋น๊ตํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ NULL ๊ฐ์ ์ธ๋ฑ์ค์ ์ ์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
5. ํ ์ด๋ธ ์ ์ฒด ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
SELECT * FROM table_name;
๋น์ฐํ๊ฒ๋ ํ
์ด๋ธ์ ์ ์ฒด ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
6. ์ปฌ๋ผ์ ์๋ฃํ์ด ๋ค๋ฅธ ๊ฒ์
SELECT *
FROM table1
JOIN table2 ON table1.id = table2.age;
์์ ๊ฐ์ด ์ปฌ๋ผ์ ์๋ฃํ์ด ๋ค๋ฅธ ๊ฒ๋ค์ ๋น๊ตํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๋ฉด, ์ธ๋ฑ์ค์ ์ฑ๋ฅ์ด ์ ํ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์ค์บ์ ์ํํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฐ๋ค์ ๋ํด ์๋์ผ๋ก ์๋ฃํ ๋ณํ์ด ์ํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฃํ ๋ณํ์ด ์ธ๋ฑ์ค์ ์ฑ๋ฅ์ ์ ํ์ํค๋ ์ด์ ๋ ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ ์๋ฃํ์ด ๋ค๋ฅธ ๋ ์ปฌ๋ผ์ ๋น๊ตํ๋ ค๋ฉด ๋ ์ปฌ๋ผ์ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ ์ ์๋ฃํ ๋ณํ์ด ์ํ๋์ด์ผ ํ๋ฏ๋ก, ์ธ๋ฑ์ค์ ์ ๋ ฌ ์์๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฐ์ํ๊ฒ ๋์ด ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
7. IN ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒ์์์ IN ๋ชฉ๋ก์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ
SELECT *
FROM table_name
WHERE id IN (1, 2, 3, ..., 1000);
IN ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒ์์์ IN ๋ชฉ๋ก์ ๊ฐ์๊ฐ ์์ ๊ฐ์ด ๋ง์ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ํํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ N๊ฐ์ ์ธ๋ฑ์ค ์ค์บ์ ์ํํ๋ ๊ฒ์ด Full Scan์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋น์ฉ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์๋ IN ์ฐ์ฐ์ ๋์ ์๋์ ๊ฐ์ด JOIN์ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
SELECT *
FROM table_name
JOIN (
SELECT 1 AS id UNION ALL
SELECT 2 AS id UNION ALL
SELECT 3 AS id UNION ALL
...
SELECT 1000 AS id
) AS ids ON table_name.id = ids.id;
์์ ์ฟผ๋ฆฌ๋ IN ๋ชฉ๋ก ๋์ UNION ALL์ ์ฌ์ฉํ์ฌ 1000๊ฐ์ ๊ฐ์ ์ง์ ์์ฑํ๊ณ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์กฐ์ธ์ ์ํํ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์ต๋๋ค.
'BackEnd๐ฑ > DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MySQL์์ VARCHAR์ TEXT์ ์ฐจ์ด (1) | 2023.09.17 |
---|---|
Redis์ ๋ฐ์ดํฐ ํ์ , ๋ช ๋ น์ด์ ํ์ฉ ์ฌ๋ก (0) | 2023.09.05 |
์ค๋ฌด์์ Redisson์ ์ฐ๊ฒฐํ๋ฉด์ ๊ฒช์ ๋ฌธ์ ์ ๋ค (2) | 2023.08.18 |
Docker ์ปจํ ์ด๋์ MariaDB ์ค์นํ๊ธฐ (4) | 2023.05.12 |
[MySQL] UPSERT (ON DUPLICATE KEY UPDATE) (0) | 2022.05.23 |
[MySQL] SELECT ๋ฌธ์์ NULL ๊ฐ ์นํํ๊ธฐ (0) | 2022.05.12 |
๋๊ธ