하나 이상의 테이블로부터 유도되어 만들어진 가상의 테이블. 쿼리를 간단하게 쓰기위해 생성한다.
CFEATE VIEW [view 이름]
AS SELECT [포함시킬 컬럼]
FROM [테이블]
JOIN문
VIEW는 실제 테이블처럼 데이터가 저장되는 것이 아니라 쿼리가 저장되는 것이라는 차이가 있다.
DB 테이블에서 삽입, 수정, 삭제 기능의 성능을 포기하는 대신 데이터 읽기 속도를 높이는 자료구조로, B-Tree 방식의 인덱싱을 사용한다.

200만개의 샘플 데이터에서 위의 쿼리를 실행하면

위와같이 약 27초가 걸리는 모습을 볼 수 있다.

해당 쿼리의 체크항목 들은 EXPLAIN 키워드로 볼 수 있는데 다음과 같다.
SQL문법으로 작성된 코드를 기계어 코드로 변경하고 변경된 코드를 실행한다.
따라서 작성된 SQL을 컴파일한 후 이를 실행하게 되는데, SP는 빈도수가 높은 사항에 대해 미리 컴파일을 해두고 필요할 때 마다 요청키로 바로 실행한다.
DELIMITER $$
CREATE PROCEDURE SP이름 (IN 또는 OUT 속성)
BEGIN
[SP를 진행할 쿼리문]
END $$
DELIMITER;CALL SP이름;DELIMITER $$
CREATE PROCEDURE SP이름 (IN userIdx INT)
BEGIN
SELECT * FROM member WHERE idx = userIdx;
END $$
DELIMITER;SP는 만들어 둔다고 해서 성능이 나빠지는 경우는 없기 때문에 SELECT문 사용시 거의 전부 사용한다.
5명의 멤버가 각각 아래의 해당하는 갯수만큼 게시글을 작성했을 때, kang, kim, park 3사람이 작성한 게시글 수와 사용자명을 조회하는 쿼리의 성능을 개선해보자
- 20만 (kang)
- 20만 (kim)
- 20만 (lee)
- 200만 (park)
- 20만 (sim)
SELECT COUNT(writerIdx) AS COUNT, nickname
FROM post
LEFT JOIN member
ON post.writerIdx = member.idx
WHERE nickname = 'kang' OR nickname = 'kim' OR nickname = 'park'
GROUP BY member.idx, member.nickname;
개선 전
쿼리에 따른 실행 결과
실행 시간(2.89s)
1차 개선(INDEX 사용)
쿼리에 따른 실행 결과
실행 시간 (2.89 -> 1.4s, 약 2배 개선)
2차 개선(SP 사용)
쿼리에 따른 실행 결과
실행시간(1.4s -> 1.0s)
쿼리 앞에 붙이는 키워드로 쿼리를 실행하기 전 실행 계획에 대한 정보를 알려준다.
답이 정해져 있지 않기 때문에 프로젝트 성격과 흐름에 따른 근거를 토대로 결정해야한다.
- 수정, 삭제, 삽입이 빈번한지?
- CPU나 메모리 사용량은 쿼리별로 어떤지?
등등 다양한 지표를 근거에 맞게 반영해서 성능을 개선시키려는 노력이 중요하다.