데이터베이스베이직인덱스 
NHN NEXT 정호영 
나눔고딕및나눔고딕코딩글꼴을설치해주세요.
데이터베이스의인덱스 
테이블에대한동작의속도를높여주는자료구조
데이터베이스의인덱스 
테이블에대한동작의속도를높여주는자료구조 
사실은 
Insert,Update,Delete속도를희생하여 
읽기속도를높임
인덱스실험1 
1.indexdb.sql실행 
2.200만건의레코드삽입 
LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE user 
FIELDS idENTIFIEDBY ',' 
IGNORE 1 LINES;
쿼리수행 
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';
쿼리마다성능이다른이유는? 
특정칼럼에대해인덱스가자동으로만들어짐 
PRIMARYKEY인덱스자동생성 
FOREIGNKEY에도인덱스자동생성
인덱스확인해보기 
SHOW INDEX FROM user;
직접인덱스만들어보기 
CREATE INDEX idX_user_1 ON user(last_visit);
다시쿼리실행 
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';
데이터삭제후다시삽입 
데이터삭제후다시삽입 
삭제에오랜시간이걸립니다. 
데이터삽입시간도더길어졌습니다. 
왜그런차이가생겼을까요?
데이터삭제후다시삽입 
Bulkinsert를할때는 
(1)인덱스제거–데이터삽입-인덱스재생성 
(2)인덱스일시중지–데이터삽입-인덱스활성화 
를사용할수있는데,(1)번이더빠릅니다.
인덱스일시중지 
ALTER TABLE user DISABLE KEYS; 
LOAD DATA … 
ALTER TABLE user ENABLE KEYS;
복합인덱스만들기 
여러컬럼을묶어서인덱스를만들수도있습니다. 
DROP INDEX idX_user_1 ON user; 
CREATE INDEX idX_user_2 ON user(last_visit, money);
복합인덱스성능실험 
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';
복합인덱스실험 
복합인덱스는순서가중요 
첫번째조건을활용할수없다면복합인덱스는 
사용이불가능합니다.
인덱스의종류 
물리적저장구조에따라 
ClusterdIndex 
SecondaryIndex(Non-clusterdIndex) 
논리적저장구조에따라 
UniqueIndex 
Non-uniqueIndex
ClusteredInex 
클러스터드인덱스는 
사실인덱스가아니라저장구조그자체 
B+트리를사용 
리프노드:실제레코드(데이터페이지) 
키:PRIMARYKEY값
SecondaryIndex 
직접인덱스를만들면세컨더리인덱스를생성 
세컨더리인덱스의구조는 
B+트리를사용 
키:인덱스를생성한컬럼 
리프노드:해당레코드의PRIMARYKEY값을저장 
실제데이터를찾으려면인덱스를두번찾아야함
FullTextSearch 
성능이좋지않은자연어검색(FullTextSearch)을지원 
없는것보다나은정도? 
보통게시판등에자주사용됩니다. 
InnoDB도지원됩니다! 
FullText인덱스를먼저만들어야사용가능합니다.
FullTextIndex만들기 
CREATE FULLTEXT INDEX idX_FT1 ON TTT(TITLE, BODY);
FullTextIndex사용하기 
SELECT 
BODY, MATCH(BODY) AGAINST(‘마르고닳도록’) FROM TTT 
SELECT * 
FROM TTT WHERE MATCH(BODY) AGAINST (‘백두산이닳도록’);
한국어검색 
FULLTEXT는mysql이적합하지않은것같습니다. 
전문검색엔진을사용하는것이좋습니다. 
-스핑크스 
-루씬
THANK YOU!!!

MySQL 인덱스의 기초