[WIP] INDEX 인덱스
- 인덱스 설정을 한다고 해서 무조건 쿼리가 빨라지는 것은 아니다.
- 쿼리의 성능은 인덱스 구성과 함께 어떤 식으로 쿼리를 실행하고 있는지가 포인트.
# 1)
SELECT user_id FROM user
WHERE user_country = 'KOREA'
AND user_city = 'SEOUL';
# 2)
SELECT user_id FROM user
WHERE user_country = 'KOREA'
AND modified_time > '2021-11-07'
AND user_city = 'SEOUL';
* 1) 의 경우, 성능개선을 위해 인덱스는 쿼리 조건문 순서대로 설정해야 한다.
CREATE INDEX CountryCity
ON User (user_country, user_city);
* 2) 는 '1의 예시'보다 빠르다고 생각할 수 있지만, 'modified_time'이 인덱스에 등록되어 있지 않기 때문에, 인덱스 탐색이 아니라 테이블 탐색이 일어나서 성능 개선이 일어나지 않을 수 있다.
※ Term
- 인덱스 탐색
- 특정 쿼리를 수행하기 위해서 인덱스를 탐색하는 것
- 테이블 탐색
- 특정 쿼리를 수행하기 위해서 테이블을 탐색하는 것
JOIN 알고리즘
주요한 세 가지 조인 알고리즘
- 중첩 루프
1.1. 단순히 쿼리 두개가 실행된다고 보면 된다.
선행 드라이빙 쿼리가 실행되고, 선행 드라이빙 쿼리 결과에 해당하는 row들을 쿼리하는 알고리즘.
1.2. 드라이빙 쿼리의 결과가 작지 않으면, DB옵티마이저는 다른 알고리즘을 선택함. (이건 실행계획같은걸 봐야하나?) - 해시 조인
2.1. 한 쪽 테이블을 해시 테이블로 만들고, 다른 테이블의 각 row를 탐색함.
한 쪽 테이블을 해시화 하기 때문에 속도가 상당히 빠른편.
2.2. 튜닝을 위해서는 WHERE절 또는 ON 절에 사용되는 컬럼에 대한 인덱스 설정을 살펴본다. - 소트머지(Sort-merge) 조인
3.1. 두 테이블을 정렬한 뒤에 정렬된 두 항목을 결합하는 식으로 수행. (WIP: 알아보자 잘 이해 안 됨.)
- 양 쪽의 데이터를 정렬하는 비용이 크기 때문에 잘 사용하지 않는다. 일단 정리되면 성능은 좋음!
단, 인덱스로 이미 정렬이 된 데이터가 있으면 그 땐 정렬 비용이 들지 않기 때문에 좋은 성능 발휘!
- 일반적으로 소트머지 조인보다 해시 조인이 자주 사용됨. (한 쪽은 해시화하고 실행하기 때문에 쿼리 비용이 더 저렴.)
3.2. 조인 순서에 의미가 없고 성능에도 영향을 미치지 않는다는게 소트머지 조인의 특징!