Index๋?
Index๋ RDBS์์ ์กฐํํ ๋ ์๊ธฐ๋ full scan ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ณ ์๋์๋ค.
select * from member where userName = 'ํ๋ฏธ';
๋ผ๋ ๋ฌธ์ด ์์ ๋, table์ full scanํ๋ค.
๋ฉค๋ฒ row๊ฐ 1000๊ฐ๋ผ๋ฉด? 10000๊ฐ๋ผ๋ฉด? ๋ฌธ์ ๊ฐ ์ฌ๊ฐํ ๊ฒ์ด๋ค.
๋ฐฐ๊ฒฝ์ง์
- ์ฌ๋ฌ๋ถ์ด ๋ง์ฝ mySQL innoDB๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ด๋ฏธ indexing์ ์ฌ์ฉํ๊ณ ์๋ ์ค์ด๋ค.
- innoDB๋ pk๋ฅผ ๊ธฐ์ค์ผ๋ก indexingํ๋ค.
- ๋ง์ฝ pk๊ฐ ์๋ค๋ฉด ์ฌ์ฉ์์๊ฒ๋ ๋ด๋ถ์ ์ผ๋ก ์์ฑํ๋ค. ์ด๋, ์์ฑ๋๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ biggint๋ณด๋ค ํฌ๋ค๊ณ ํ๋ pk๋ ๋ง๋ค์ด์ฃผ๋ ๊ฒ ์ข๋ค!
- clusted index๋ก ๋ง๋ค์ด์ค๋ค.
Index ์ฌ์ฉํ๊ธฐ
-
๊ธฐ์กด ํ
์ด๋ธ์ ์ธ๋ฑ์ค ์ถ๊ฐ
ALTER TABLE table_name ADD INDEX(keyword(20))
-
ํ
์ด๋ธ ์์ฑ๊ณผ ๋์์ ์ธ๋ฑ์ค ์ถ๊ฐ
CREATE TABLE table_name (
keyword varchar(20),
INDEX(keyword(20))
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DB์ ์ธ๋ฑ์ค์์ ์ฐ์ด๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์งํธ๋ฆฌ , ํด์๊ฐ ์๋ค.
์ด์งํธ๋ฆฌ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๋ฏธ๋ฆฌ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋๋ฐ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์ ๋ ์ ๋ ฌ๋ ์ํ๋ก ๋์๋ ์๋ค.
ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ํ
์ด๋ธ ๋ฐ์ดํฐ์ ๋ณ๊ฐ๋ก ์ธ๋ฑ์ค์ฉ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋๋ฐ ์ด๋ ์ธ๋ฑ์ค๋ค์ ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์์ฑ๋๋ค.
Index scan ๋ฐฉ์
- index range scan : ์ด๋ค ์์์ ๋ถํฐ ํน์ ๋ฒ์๋ฅผ ์ค์บํ๋ ๋ฐฉ์
- index full scan
- index skip scan
- index fast full scan
์ด๋ค ์ปฌ๋ผ์ Index๋ก ์ง์ ํ ๊น?
- where์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ
- ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ (์ค๋ณต๋๊ฐ ๋ฎ์) ์ปฌ๋ผ
์ค๋ณต๋ โฌ ์นด๋๋๋ฆฌํฐ โฌ : ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ
์ค๋ณต๋ โฌ ์นด๋๋๋ฆฌํฐ โฌ : ์ฑ๋ณ
์นด๋๋๋ฌํฐ
์ถ์ฒ: ๊ฐ์กธ๋๋ ๋ธ๋ก๊ทธ
์ค๋ณต๋๊ฐ ๋์ (์ฑ๋ณ)๋ก indexing์ ํ๋ฉด ์ํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด์ ๋ ๊ฒ์ํ๊ณ ์ฑ๋ฅ์ด ๋ฎ์์ง๋ค.
- order by ๋น๋๊ฐ ๋์ ์ปฌ๋ผ
index table์ index๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ผ์ ์ค๋ณตํด์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด๋ ์์๋ ์ค๋ณต๋๊ฐ ๋ฎ์ ์ปฌ๋ผ์ด ์์ ์๋ ๊ฒ ์ข๋ค.
- (์ถ์ฒ) ๊ฒฐํฉ์ธ๋ฑ์ค์์ ์ปฌ๋ผ์ ๋ถ๋ณ๋ ฅ(์ค๋ณต๋)๊ณผ ์ ๋ ์์น ์ฌ๋ถ๋ ์๊ด์ด ์์ต๋๋ค. ์คํ๋ ค ๋ถ๋ณ๋ ฅ์ด ๋ฎ์ ์ปฌ๋ผ์ด ์ ๋์ ์์นํ๋ ๊ฒ์ด index skip scan ์ธก๋ฉด์์ ๋ ์ ๋ฆฌํฉ๋๋ค.
๋จ์
- ๋ณ๋์ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ๋ค.
- insert/update/delete ์ฑ๋ฅ์ด ์ ์ข์์ง.
- ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, index table์ ๋ค์ sortingํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๐ค
index column์ updateํด๋ sortingํ ๊น? ๋น๊ทผ
- ์์ต๋ถ๊ธฐ์ ์ด ์กด์ฌํ๋ค.
- ๋ถํฌ๋๊ฐ 10%~15% ์ด์์ด๋ฉด full table scan์ด ์ ๋ฆฌํ๋ค
๋ถํฌ๋ = 1/์ปฌ๋ผ ๊ฐ์ ์ข
๋ฅ
- (๐โ๋ํผ์
) indexing์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋ค๋ฉด ๋ ํ์ํด์ผ ํ๊ณ ๊ฒฐ๊ตญ ์ถ๊ฐ์ ์ผ๋ก index table๊น์ง ํ์ํ๋ฉด์ ์ฑ๋ฅ์ด ์ ์ข์์ง๋ ๊ฒ ๊ฐ๋ค.
- ใด์๊ฒ์ index๋ฅผ ์๋ชป ๊ฑธ์์ ๋์ด๊ณ , ๊ทธ ์ธ์๋ I/O ๋ฌธ์ ๊ฐ ์๋ค.
Full Scan์ ํ ๋๋ Multiblock I/O๋ก I/O ํ์๊ฐ ์ ์ ๋ฐ๋ฉด, index๋ฅผ ํ ๋์๋ Singl Block I/O๋ก ๋ฐ์ดํฐ๊ฐ ๋ง์์ก์ ๋ I/O ํ์๊ฐ ์ฆ๊ฐํ๋ ๋ฌธ์ ๋ ์๋ค.
- ๋ฐ์ดํฐ ์ ์์ฒด๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด (์ต ๋จ์) index table ๊ด๋ฆฌ ๋น์ฉ ๋๋ฌธ์ ์คํ๋ ค full scan์ด ๋น ๋ฅด๋ค.
Clustered, Non Clustered
Clustered
- (์) ์ฑ
์์ ๋ฐ๋ก ํ์ด์ง๋ฅผ ์๋ ๊ฒ
- ๋ฐ์ดํฐ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๋ ฌ๋์ด ์ ์ฅ๋๋ค.
- ๊ทธ๋์ ๋
ผ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ณด๋ค ๋น ๋ฅด๋ค.
- ๋ฒ์ ์กฐํํ ๋ ์ข๋ค.
Non Clustered
- (์) ์ฑ
์์ ๋ชฉ์ฐจ๋ฅผ ๋ณด๋ ๊ฒ
- ๋ฐ์ดํฐ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๋ ฌ๋์ง ์์๋ค.
- Index ํ์ด์ง์ ์ ๋ ฌ๋๋ค.
- ์ฝ์
,์์ ,์ญ์ ํ ๋๋ Non-Clustered๊ฐ ํจ์จ์ ์ด๋ค.
- ๋ฒ์ ์กฐํ(Range Query)๋ฅผ ํ ๊ฒฝ์ฐ ๊ฑฐ์ ์ธ๋ฑ์ค์ ๋์์ ๋ฐ์ ์ ์๋ค.
(์ธ๋ฑ์ค๋ฅผ ์ํ๋ค. Table Scan์ ํ๊ฒ ๋๋ค.) ์์ง?!!
๊ธฐํ
๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํด๋น ์ฟผ๋ฆฌ ์คํ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋์ง ์ํ๋์ง ํ์ธํ ์ ์๋ ์์ฝ์ด๊ฐ ์๋ค. (ex : EXPLAIN)
where ์กฐํ ์์์ index ์์๋ฅผ ๋ง์ถ ํ์๋ ์๋ค.
- ๋ด๋ถ์ ์ผ๋ก ์์์ index ์์์ ๋ง๊ฒ ์ฌ๋ฐฐ์ดํด์ค๋ค.
- ํ๋ ์ ์๋ฏธํ ์ฑ๋ฅ ์ด์ ๋
ธ๋
ธ
์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋ ์ปฌ๋ผ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉํด์ผ๋ง ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋๋ค.
where salary * 10 > 150000;
(X)
where salary > 150000 / 10;
(O)
์ ํํ ํ์
์ ์ฌ์ฉ
- ์ปฌ๋ผ์ด ๋ฌธ์์ด์ธ๋ฐ ์ซ์๋ก ์กฐํํ๋ฉด ํ์
์ด ๋ฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋์ง ์์ต๋๋ค.