mysql 인덱스의 기초

24
데이터베이스 베이직 인덱스 NHN NEXT 정호영 나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.

Upload: hoyoung-jung

Post on 12-Jul-2015

1.621 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: MySQL 인덱스의 기초

데이터베이스 베이직

인덱스

NHN NEXT 정호영

나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.

Page 2: MySQL 인덱스의 기초

데이터베이스의인덱스

테이블에 대한 동작의 속도를 높여주는 자료구조

Page 3: MySQL 인덱스의 기초

데이터베이스의인덱스

테이블에 대한 동작의 속도를 높여주는 자료구조

사실은

Insert, Update, Delete 속도를 희생하여

읽기 속도를 높임

Page 4: MySQL 인덱스의 기초

인덱스실험1

1. indexdb.sql 실행

2. 200만건의 레코드 삽입

LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE user

FIELDS idENTIFIED BY ','

IGNORE 1 LINES;

Page 5: MySQL 인덱스의 기초

쿼리 수행

1. indexdb.sql 실행

2. 200만건의 레코드 삽입

SELECT COUNT(*) FROM user WHERE id LIKE 'M%';

SELECT COUNT(*) FROM user WHERE id LIKE '%1';

SELECT COUNT(*) FROM user WHERE money = 1000;

SELECT COUNT(*) FROM user WHERE last_visit > '2014-05-17';

Page 6: MySQL 인덱스의 기초

쿼리마다성능이 다른이유는?

특정 칼럼에 대해 인덱스가 자동으로 만들어짐

PRIMARY KEY 인덱스 자동 생성

FOREIGN KEY 에도 인덱스 자동 생성

Page 7: MySQL 인덱스의 기초

인덱스확인 해보기

SHOW INDEX FROM user;

Page 8: MySQL 인덱스의 기초

직접 인덱스만들어보기

CREATE INDEX idX_user_1 ON user(last_visit);

Page 9: MySQL 인덱스의 기초

다시 쿼리실행

SELECT COUNT(*) FROM user WHERE id LIKE 'M%';

SELECT COUNT(*) FROM user WHERE id LIKE '%1';

SELECT COUNT(*) FROM user WHERE money = 1000;

SELECT COUNT(*) FROM user WHERE last_visit > '2014-05-17';

SELECT COUNT(*) FROM user WHERE last_visit <> '2014-04-15';

Page 10: MySQL 인덱스의 기초

데이터삭제 후 다시 삽입

데이터 삭제 후 다시 삽입

삭제에 오랜 시간이 걸립니다.

데이터 삽입 시간도 더 길어졌습니다.

왜 그런 차이가 생겼을까요?

Page 11: MySQL 인덱스의 기초

데이터삭제 후 다시 삽입

Bulk insert를 할 때는

(1) 인덱스 제거 – 데이터 삽입- 인덱스 재생성

(2) 인덱스 일시중지 – 데이터삽입- 인덱스 활성화

를 사용할 수 있는데, (1) 번이 더 빠릅니다.

Page 12: MySQL 인덱스의 기초

인덱스일시중지

ALTER TABLE user DISABLE KEYS;

LOAD DATA …

ALTER TABLE user ENABLE KEYS;

Page 13: MySQL 인덱스의 기초

복합 인덱스만들기

여러 컬럼을 묶어서 인덱스를 만들수도 있습니다.

DROP INDEX idX_user_1 ON user;

CREATE INDEX idX_user_2 ON user(last_visit, money);

Page 14: MySQL 인덱스의 기초

복합 인덱스성능 실험

SELECT COUNT(*) FROM user WHERE last_visit > '2014-05-15';

SELECT COUNT(*) FROM user WHERE last_visit > '2014-05-15' AND money > '5000';

SELECT COUNT(*) FROM user WHERE money = '5000';

SELECT COUNT(NAME) FROM user WHERE last_visit <> '2014-05-15' AND money ='5000';

SELECT COUNT(NAME) FROM user WHERE last_visit = '2014-05-15' AND money ='5000';

Page 15: MySQL 인덱스의 기초

복합 인덱스실험

복합 인덱스는 순서가 중요

첫 번째 조건을 활용할 수 없다면 복합 인덱스는

사용이 불가능합니다.

Page 16: MySQL 인덱스의 기초

인덱스의종류

물리적 저장구조에 따라

Clusterd Index

Secondary Index(Non-clusterd Index)

논리적 저장구조에 따라

Unique Index

Non-unique Index

Page 17: MySQL 인덱스의 기초

Clustered Inex

클러스터드 인덱스는

사실 인덱스가 아니라 저장구조 그 자체

B+ 트리를 사용

리프노드 : 실제 레코드( 데이터 페이지 )

키 : PRIMARY KEY 값

Page 18: MySQL 인덱스의 기초
Page 19: MySQL 인덱스의 기초

Secondary Index

직접 인덱스를 만들면 세컨더리 인덱스를 생성

세컨더리 인덱스의 구조는

B+ 트리를 사용

키 : 인덱스를 생성한 컬럼

리프 노드 : 해당 레코드의 PRIMARY KEY 값을 저장

실제 데이터를찾으려면인덱스를두 번 찾아야함

Page 20: MySQL 인덱스의 기초

Full Text Search

성능이 좋지 않은 자연어 검색(Full Text Search)을 지원

없는 것보다 나은정도?

보통 게시판 등에 자주 사용됩니다.

InnoDB도 지원 됩니다!

Full Text 인덱스를 먼저 만들어야 사용가능 합니다.

Page 21: MySQL 인덱스의 기초

Full Text Index 만들기

CREATE FULLTEXT INDEX idX_FT1 ON TTT(TITLE, BODY);

Page 22: MySQL 인덱스의 기초

Full Text Index 사용하기

SELECT

BODY, MATCH(BODY) AGAINST(‘마르고 닳도록’) FROM TTT

SELECT *

FROM TTT WHERE MATCH(BODY) AGAINST (‘백두산이 닳도록’);

Page 23: MySQL 인덱스의 기초

한국어검색

FULL TEXT 는 mysql이 적합하지 않은 것 같습니다.

전문 검색엔진을 사용하는 것이 좋습니다.

-스핑크스

-루씬

Page 24: MySQL 인덱스의 기초

THANK YOU!!!