개요spring JPA에서 MySQL skip locked를 활용한 성능 최적화 방법 설명선착순 쿠폰 발급 상황에서의 동시성 이슈를 고려하여 최적화MYSQL skip locked 관련 내용 ERD 하나의 쿠폰 테이블에서 모든 쿠폰 정보를 관리 새로운 쿠폰이 추가되면 새로운 쿠폰명/쿠폰타입으로 테이블에 데이터를 append하는 방식 유저ID가 NULL인 필드는 아직 발급되지 않은 쿠폰을 의미 JPA EntityUser Entity@Entity @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(n..
query optimization
INSERTINSERT IGNORE다음과 같은 경우에 추가되는 레코드를 무시프라이머리 키나 유니크 인덱스 컬럼의 값이 이미 테이블에 존재하는 경우저장하는 레코드의 컬럼이 테이블의 컬럼과 호환되지 않는 경우INSERT … ON DUPLICATE KEY UPDATE프라이머리 키나 유니크 인덱스의 중복이 발생하면 UPDATE 문장의 역할을 수행LOAD DATALOAD DATA 명령은 단일 스레드로 실행되기 때문에 적재해야 할 데이터 파일이 매우 크다면 시간이 매우 길어질 수 있다.프라이머리 키 선정프라이머리 키의 선정은 “INSERT 성능”과 “SELECT 성능” 중의 하나를 선택하는 것INSERT가 매우 많이 실행되는 테이블의 경우, 프라이머리 키를 단조 증가 또는 단조 감소하는 패턴의 값을 사용하는 것이 ..
쿼리 작성과 연관된 시스템 변수영문 대소문자 구분MySQL의 경우 설치된 운영체제 따라 테이블명의 대소문자 구분윈도우의 경우 대소문자 구분 X유닉스 계열의 경우 대소문자 구분 O따라서 운영체제와 관계없이 대소문자 구분의 영향을 받지 않게 하려면 설정 파일의 lower_case_table_names 시스템 변수를 설정lower_case_table_names=1 로 설정하면 모든 테이블이 소문자로 저장되고 대소문자 구분 XMySQL 연산자와 내장 함수숫자MySQL 서버에서는 문자열=숫자 간 비교일 때 문자열을 숫자로 자동 변환where 조건 비교가 수행될 때 주의가 필요select * from tab_test where number_column='10001';select * from tab_test wher..