MySQL 기초

index

index

색인, 조회할 때 원하는 행을 빠르게 찾을 수 있게 준비해둔 데이터

인덱스의 종류

  • primary: 중복되지 않는 유일한 키
  • normal : 중복을 허용하는 인덱스
  • unique : 중복을 허용하지 않는 유일한 키
  • foreign : 다른 테이블과의 관계성을 부여하는 키
  • full text : 자연어 검색, myisam에서만 지원

예제

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `name` char(4) NOT NULL,
  `address` varchar(50) NOT NULL,
  `department` enum('국문과','영문과','컴퓨터공학과','전자공학과','물리학과') NOT NULL,
  `introduction` text NOT NULL,
  `number` char(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_number` (`number`) USING BTREE,
  KEY `idx_department` (`department`),
  KEY `idx_department_name` (`department`,`address`),
  FULLTEXT KEY `idx_introduction` (`introduction`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES (1, '이숙경', '청주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다닙니다. computer', '0212031');
INSERT INTO `student` VALUES (2, '박재숙', '서울', '영문과', '저는 영문과에 다닙니다.', '0512321');
INSERT INTO `student` VALUES (3, '백태호', '경주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다니고 경주에서 왔습니다.', '0913134');
INSERT INTO `student` VALUES (4, '김경훈', '제천', '국문과', '제천이 고향이고 국문과에 다닙니다.', '9813413');
INSERT INTO `student` VALUES (6, '김경진', '제주', '국문과', '이번에 국문과에 입학한 김경진이라고 합니다. 제주에서 왔어요.', '0534543');
INSERT INTO `student` VALUES (7, '박경호', '제주', '국문과', '박경호입니다. 잘 부탁드립니다.', '0134511');
INSERT INTO `student` VALUES (8, '김정인', '대전', '영문과', '김정인입니다. 대전에서 왔고, 영문과에 다닙니다.', '0034543');

primary key

  • 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다.
  • where 문을 이용해서 데이터를 조회할 때 가장 고속으로 데이터를 가져올 수 있다.
  • 테이블마다 딱 하나의 primary key를 가질 수 있다.
select * from student where id=3;

unique key

  • 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다. (== primary key)
  • 고속으로 데이터를 가져올 수 있다.
  • 여러개의 unique key를 지정할 수 있다.
select * from student where number=0534543;

normal key

  • 중복을 허용한다.
  • primary, unique 보다 속도가 느리다.
  • 여러개의 키를 지정할 수 있다.
select * from student where department='국문과'

Full Text

  • mysql의 기본설정(ft_min_word_len)이 4로 되어 있기 때문에 최소 4글자 이상을 입력하거나 이 값을 조정해야 한다.
  • mysql은 전문 검색 엔진이 아니기 때문에 한글 검색이 잘 안된다.
    전문검색엔진으로 lucene, sphinx 참고
  • 스토리지 엔진 중 myisam에서만 사용가능
SELECT introduction, MATCH(introduction) AGAINST('영문과에') FROM student WHERE MATCH (introduction) AGAINST('영문과에');

중복키

  • 하나의 키에 여러개의 칼럼을 포함
select * from student where department='국문과' AND address='제주';

인덱스의 정의 방법

  • 자주 조회되는 칼럼에 적용
  • 조회 시 오랜시간을 소모하는 컬럼에 적용
  • 데이터가 긴 경우 인덱스를 사용하지 않는다.

 

댓글

댓글 본문
  1. 김민석
    질문이 있습니다 !! `idx_number` 와 `idx_department` 와 `idx_department_name` 이렇게 인덱스 이름을 지정해주는 이유는 무엇인가요?? 인덱스 이름만으로 사용할수가 있는건가요??
  2. ggyuker
    2022-01-13 수강완료
  3. Ram Lee
    감사합니다.
  4. 가즈아
    이고잉님이 "이거는 모르셔도 됩니다" 라고 할 때 마음이 편해집니다~ ㅎㅎ
  5. 인덱스는 데이터를 더 빨리 찾게 도와준다.
    인덱스의 종류
    -primary: 중복 불가, 테이블당 오직 1개의 키
    -unique: 중복 불가, 여러개의 유니크 키를 가질 수 있다.
    -normal: 일반적인 키, 중복가능, 여러개의 키를 가질 수 있다.
    -full text: 특정한 문장을 검색할때 사용/사용기준이 복잡하니 주의 해야한다.
  6. netic9
    FULLTEXT INDEX search 는 innoDB 에서도 지원합니다. 수정이 필요할 듯 하네요.
    좋은 강의 감사합니다.
  7. 아이디어노트
    MySQL을 스스로 공부할 수 있는 능력을 길렀습니다
    좋은 강의 감사합니다!
  8. sheis
    잘 봤어요^^
  9. Againer
    full text수식을 넣어서 윈도우버전 cmd를 사용한 MySQL에 넣어봤는데 empty set이라고 나옵니다. 어떤문제가 있는걸까요? 프로그램은 APMSETUP을 사용하고있습니다.
  10. elastic.dba
    "중복키" 보다 "복합키"라고 하는게 낫지 않을까요?
    그리고, normal index는 primary key 보다 항상 느린가요?
  11. NamJin Kim
    감사합니다
  12. silverline
    감사합니다..^^
  13. 감사합니다~ !
  14. JustStudy
    고맙습니다
  15. 이주환
    2016. 04. 12
    정독하고갑니다.
  16. dkiekkf
    노멀 인덱스는 지정을 해주나 안해주나 차이가 없어보이는데

    왜 사용하는건가요?
  17. ryan04x
    [보충]

    1. 중복키에 관해
    중복키 = 결합키 = 복합키 = Composite Index

    컬럼 a, b, c를 중복키로 사용할 때 index (a,b,c)로 지정하였다면 이 순서가 중요한데,
    중복키는 각 컬럼의 값을 이어붙인것이기때문에 -concat- 왼쪽부터 순서대로가 아니면 인덱스로 사용할 수 없다.


    WHERE a=1;
    WHERE a=1 AND b=2;
    WHERE a=1 AND b=2 AND c=3;
    과 같은 식으로 사용해야지 인덱스가 적용되지

    WHERE b=2 등은 인덱스가 적용되지 않는다.

    ------------------------------------------------------------
    2. 인덱스 확인법
    인덱스를 타는지 확인하는 방법은
    EXPLAIN을 명령어 앞에 붙여서 나오는 테이블에서
    type 컬럼을 보면 된다.
    all이면 인덱스를 전혀 타지 않는 것이므로 좋지 않다.


    초보자인데 공부한 것을 보충합니다 ;)
  18. 육점이
    항상 감사합니다!
  19. 강의 잘 보고 있습니다.
    강의에서와같이 select문으로 조회를 해보면 한글 이름이 2글자에서 짤립니다.
    강의처럼 3글자로 뜨지 않구요.. 이건 무슨 설정에서의 오류가 있어서 그러는걸까요?..
    cmd에서 하고있긴한데요 쿼리브라우저로 하면 한글이 깨져서 나옵니다.
    데이터베이스에서 charset set utf8 collate utf8_general_ci 로 설정해줬는데도이래요 이건 어떻게 수정할 방법이 없나요?

    아 그리고 한글이 두글자인경우가 char(4) 이거때문인거같은데 영문이 1바이트 한글이 2바이트라서 이렇게짤리는건가요?.. 아니라면 강의영상과 왜 다르게 출력이되는건가요? ㅠ
  20. SELECT introduction, MATCH(introduction) AGAINST('영문과에') FROM student WHERE MATCH (introduction) AGAINST('영문과에');

    Empty set <0.00 sec> 이렇게 출력됩니다.
  21. 샤핀
    감사합니다. 역시 최고의 강의! ^^
  22. 자유로운푸른곰
    SPATIAL 의 설명도 추가해주세요 ^^
  23. Chris
    인덱스는 결국 조회의 효율성을 높이기 위한 방법이군요!!!
  24. 기본기
    감사합니다. db를 자주사용하지만 매번 데이터 검색 기능을 할때마다 어려움을 겪었는데...기본이 약하니 그런거 같습니다. 덕분에 기본부터 다시 하고 있습니다.
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기