본문 바로가기
백엔드

MySQL의 Prepare Statement

by jaeyong 2021. 6. 24.

개요

JDBC에서 사용하는 PreparedStatement를 통해 쿼리를 실행할 때

해당 쿼리를 분석한 분석 정보를 저장해 매번 실행할 때마다 쿼리 분석 시간을 Skip하여 쿼리 실행 시간을 줄여준다고 알고 있었지만

MySQL의 경우에는 조금 다른 부분이 있어 기억하고자 이 글을 작성한다.

1. MySQL Prepare Statement의 종류

1.1 Client Prepare Statement

SQL 문장에서바인딩 변수(SQL에서 '?'를 사용해 표현)에 값을 맵핑하여 하나의 완성된 SQL 문장을 MySQL 서버에 전송한다.

즉, 실제로는 MySQL 서버에선 일반 statement로 받아들이며 prepare statement이지만 매번 쿼리 문장을 분석하고 실행 계획을 수립해서 쿼리를 실행한다.

1.2 Server Prepare Statement

일반적으로 다른 DBMS에서 표현하는 Prepare Statement로 JDBC는 바인딩 할 값만 서버로 보내고

MySQL 서버는 분석된 쿼리 정보에 클라이언트로부터 받은 값만 바인딩하여 쿼리를 실행한다.

2. Server Prepare Statement의 사용

MySQL은 4.1 버전 이전에 완전한 Server Prepare Statement를 지원하지 않았고 그 이후부터 사용이 가능하다.

MySQL사에서는 기존 버전과의 호환성을 위해 Client Prepare Statement가 기본 설정으로 되어 있고 Server Prepare Statement를 사용하려면

JDBC 접속 연결 URl에useServerPrepStmts=true옵션을 추가해야 Server Prepare Statement를 사용할 수 있다.

3. Spring Boot에서 Server Prepare Statement 사용

Spring boot 에서는 DB Connection Pool로 HikariCP를 사용합니다.(Spring Boot 2.X 버전부터)

MySQL에서useServerPrepStmts=true옵션을 사용하기 위해선 HikariCP의 옵션을 추가해줘야 사용이 가능합니다.

application.yml에 다음과 같이 추가합니다.

spring: 
    datasource: 
        useServerPrepStmts=truereferences

references

댓글