검색 속도를 높이기 위해 사용하는 하나의 기술로 인덱스를 사용한다.
PK는 자동으로 인덱스가 부여된다. (고유 식별자이므로)
장점
1. 검색 속도가 빠르다
2. 테이블 행의 고유성 강화
단점
1. DB의 추가적인 공간 필요
2. 인덱스 된 필드에서 데이터를 변동할 때 성능이 떨어진다.
3. 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
그럼 일단 phone 테이블을 만들고, 데이터를 넣어서 조회해보자.
CREATE TABLE phone (
phone_code INT PRIMARY KEY,
phone_name VARCHAR(100),
phone_price DECIMAL(10,2)
);
INSERT
INTO phone
VALUES
(1, 'galaxyS24', 1200000),
(2, 'iphone14pro', 1430000),
(3, 'galaxyfold3', 1730000);
SELECT * FROM phone;

phone_codd->phone_code
galaxy24->galaxyS24
where 절을 활용한 단순 조회
SELECT * FROM phone WHERE phone_name = 'galaxyS24';
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS24';

Index 추가where 절과 마찬가지로 phone_name 으로 Index 만들어보자.
CREATE INDEX idx_name ON phone(phone_name);
SHOW INDEX FROM phone;

이렇게 보이는데, cardinality 는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.
Cardinality : 구분할 수 있는 개수 를 의미한다.
즉,phone_code는1, 2, 3-> 3개
phone_name:galaxyS24, iphone14pro, galaxyfold3-> 3개
phone_price: ... -> 3개
구분할 수 있는 개수가 3개로 동일한 상태이므로 3으로 나온다.
Cardinality 추가 예시)
마커의 색상 : 빨간색, 파란색, 초록색, 노란색, 주황색 -> 5개
사용하는 프로그래밍 언어 : Java, Python, Java, C, C -> 3개
다시 index가 추가된 column으로 조회해서 index를 태웠는지 확인해보자.
SELECT * FROM phone WHERE phone_name = 'galaxyS24';
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS24';


주기적으로 한 번씩 index를 rebuild 해줘야 한다.
ALTER TABLE phone DROP INDEX idx_name;
ALTER TABLE phone ADD INDEX idx_name(phone_name);
MySQL의 INNODB 를 사용하는 경우에는 최적화를 간단한 명령으로 할 수 있다.
OPTIMIZE TABLE phone;
