웹 개발 메모장

[mysql] INDEX 란? 본문

옛날../mssql

[mysql] INDEX 란?

도로롱주 2018. 3. 28. 16:45




INDEX 란?


INDEX의 원리


다음과 같은 DB 테이블이 있다고 합시다.


member

idx

id

name

1

member_00001

김철수

2

member_00002

홍길동

3

member_00003

김민수

4

member_00004

박희지

5

member_00005

주진모



테이블에서 아래와 같은 select 문을 실행해 결과 테이블을 얻어보려 합니다.


1
SELECT * FROM member WHERE name = '김철수';
cs


member 테이블에서 name'김철수' 인 것을 찾으려면

테이블의 1번 row 부터 5번 row 까지 전체를 다 확인해야 합니다.


idx 순으로 검색한다고 쳤을때 첫번째 row에서 '김철수'를 찾았지만

확인하지 않은 row '김철수'가 없다고 장담할 수 없기 때문입니다.



INDEX를 활용하면 검색 속도를 높일 수 있습니다. 


원리는 이렇습니다.


name 컬럼에 INDEX를 적용합니다.


그럼 예를 들어 아래와 같은 name으로 정렬된 테이블이나 가 생성됩니다.


idx

name

1

김민수

2

김철수

3

박희지

4

주진모

5

홍길동


여기서 '김철수'를 검색을 해봅시다.


두번째 row까지 확인했더니 '김철수'를 찾앗고 세번째 row부터는 '박**'으로 넘어갔습니다.

그 이후의 row들은 확인할 필요가 없습니다.

정렬 되어있으므로 확인하지 않은 row '김철수'가 없다고 장담할 수 있기 때문입니다.


따라서 당연히 속도는 빨라집니다.




INDEX의 크기


INDEX에 크기를 지정할 수 있습니다.

위의 테이블에서 id를 보시면 'member_' 까지는 모두 동일합니다.

어차피 동일한 부분을 제외한다는 의미로 위와 같은경우 INDEX(7) 로 지정한다면

'00001', '00002'.. 의 부분만으로 판단합니다.




INDEX의 사용


INDEX는 검색이 잦은, select 문의 where 조건절에서 자주 등장할 컬럼에만 설정 해주는게 좋습니다.

INDEX가 하나 추가될 때마다 정렬된 데이터를 저장할 공간이 필요하기 때문입니다.

실제로 INDEX가 없는 테이블과 있는 테이블의 테이블 생성 속도는 차이가 납니다.




FULL-TEXT INDEX


위에서 말하는 INDEX와는 조금 다릅니다.


일반적인 INDEX는 비슷한 형태의 데이터를 다룬다면


FULL-TEXT INDEX '게시글 내용'과 같은 형태를 예측할 수 없는 문자열 데이터를 다룹니다.


예를 들어 "별빛이 내린다 샤라랄랄LaLaLa~~" 와 같이

한글, 영어, 숫자, 문자가 섞여있거나 긴 내용을 검색할 때 사용됩니다.


문자열을 토큰 단위로 쪼개서 검색을 하는 방식인데


자세한 원리는 링크를 걸어두겠습니다.



※ 주의해야할 점


FULL-TEXT 인덱스는 MyISAM 엔진을 사용하는 테이블에 대해서만 생성할 수 있습니다.

또한 컬럼 데이터 타입은 반드시 Text, Binary Char, Varchar 타입을 가져야 합니다. 

한글 데이터를 검색하려면 테이블 인코딩으로 utf8을 사용해야 합니다.



Comments