본문 바로가기

DB7

[MySQL] 쿼리 개선 ( QueryDSL Cross Join, full -> range scan, 커버링 인덱스 ) 문제 상황역량검사 관리자 사이트에는 응시자를 검색하는 기능이 있다.다양한 조건으로 검색할 수 있는데 ( 응시자 이름, 응시자 점수, 응시 전형 등등 11개정도 )테스트 환경에서 해당 기능이 엄청 느리게 동작하고 있었다...! 응시자가 50만 row정도 등록되어있었고, 응시자 결과 데이터의 1개의 row 크기가 꽤 무거웠다. SpringBoot 2.6.6, JPA & QueryDSL 5.0.0, MariaDB, RDS 환경이다. 문제 해결 과정실제 쿼리 확인일단 실제 쿼리 날라가는 것을 확인했다.실제 쿼리를 보았을 때, 바로 문제되는 것으로 보이는건 cross Join이 있었다.cross Join은 두 테이블간의 모든 조합을 만드므로 성능에 안좋은 요소이다. left outer join `전형.. 2024. 6. 30.
DB Lock (s lock, x lock, index lock 등등) Lock 이란? 더보기 Lock은 데이터의 일관성을 유지하기 위해 사용하는 기능이다. 여러 클라이언트 간에 데이터에 접근하여 변경하거나 조회하는 것을 방지할 수 있다. 여기선 락의 종류와 해당 락들에 대해서 설명만 할 예정이다. Shared Lock & Exclusive Lock 더보기 Shared Lock(S Lock, Read Lock) 읽기 잠금, 공유 잠금(락)으로 불린다. 해당 락을 설정하면 여러 클라이언트가 동시에 읽기 잡을 가능하게 허용하나, 쓰기 작업은 불가능하다. Exclusive Lock(x Lock, Write Lock) 쓰기 잠금, 베타 잠금(락)으로 불린다. 해당 락을 설정하면 하나의 클라이언트가 쓰기 가능하나, 다른 클라이언트는 읽기,쓰기 둘 다 불가능하다. Table Lock .. 2023. 3. 26.
[DB] 트리거(Trigger) / MySQL 사용법 트리거(Trigger) 정의 트리거는 사전적 의미로는 '방아쇠'를 뜻한다. 방아쇠를 당기면 '자동'으로 총알이 나가듯이, 테이블에 무슨 일이 일어나면 '자동'으로 실행되는 것이다. 즉, 테이블에 부착되어서 테이블에 INSERT,UPDATE,DELETE 작업이 발생되면 자동으로 실행되는 코드를 뜻함. 트리거 명령어 # 생성 DELIMITER // CREATE TRIGGER 트리거이름 {BEFORE:AFTER} {INSERT | UPDATE| DELETE } # 뒤의 조건(삽입,수정,삭제)이 발생하기 전/후 ON 테이블명 # 트리거를 부착할 테이블 FOR EACH ROW # 각 행마다 적용 BEGIN 트리거 내용 END // # 수정은 불가 # 삭제 DROP TRIGGER 트리거가 생성하는 임시 테이블 NE.. 2022. 2. 23.
[DB] 스토어드 프로시저(SP)와 스토어드 함수 / MySQL 사용법 스토어드 프로시저(SP) 정의 SQL 쿼리문들을 하나로 묶어서 편리하게 사용하는 프로그래밍 기능을 뜻함. SQL 묶는 개념 외에 다른 프로그래밍 언어와 같은 기능(함수)을 담당할수도 있음. 실무에선 SQL문을 매번 하나하나 수행하기보다는 스토어드 프로시저로 만들어 놓은 후 스토어드 프로시저를 호출하는 방식을 많이 사용 스토어드 프로시저 명령어 전체형식 # 전체형식 CREATE [DEFINER - user] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN : OUT : INOUT ] param_name type type: Any valid MYSQL data type charact.. 2022. 2. 23.
[DB] View / MySQL 사용법 View 정의 뷰는 가상의 테이블이다. 실제 데이터를 가지고 있지 않다. 진짜 테이블에 링크된 개념으로, 뷰를 SELECT하면 진짜 테이블의 데이터를 조회하는 것과 동일한 결과. 뷰의 실체는 SELECT문이다. 뷰는 SELECT문을 실행한 결과 테이블으로 생각하면 된다. 뷰에 접근하게 되면, 뷰 생성시에 입력한 select문이 작동하고 그에 따른 결과 테이블을 반환해준다. View 관련 명령어 # 뷰 생성 명령어 CREATE VIEW (뷰명) AS SELECT (가져올 컬럼) FROM (원본테이블); # 뷰 접근 명령어 SELECT * FROM (뷰명); # 뷰 삭제 명령어 DROP VIEW (뷰명) (조건); # 조건 2가지 # RESTRICT : 뷰를 다른곳에서 참조하고 있으면 삭제 취소 # CASC.. 2022. 2. 23.
[DB] 키(Key) 정리 / MySQL Key 데이터베이스에서 튜플(Tuple)을 검색 또는 정렬시에 구분할 수 있는 기준이 되는 속성(attribute) 튜플:테이블을 구성하는 데이터들 중 가로 1줄. 즉 테이블에서의 속성들의 값을 가지고 있는 데이터 셋. 데이터베이스에선 로우(row)라고 부르고, 관계형 데이터베이스에선 튜플(Tuple) 또는 레코드(record)라고 부름 키의 종류 후보키(Candidate Key) 릴레이션에서 tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합. 2가지 조건에 만족해야함. 유일성: ket를 통해 하나의 tuple을 유일하게 식별 가능해야한다. 최소성: 꼭 필요한 속성으로만 이루어져야한다. 키를 구성하는 속성 중 하나라도 빠지면, 유일하게 식별되지 않도록 구성해야함. 릴레이션: 관계형 데이터베.. 2022. 2. 18.
[DB] 인덱스(index) / MySql에서 사용법 인덱스(index) 데이터베이스에서 인덱스는 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 책의 맨처음에 나오는 목차처럼 해당 컬럼이 어디에 있는지 저장하여, 해당부분만 검색할 수 있게 하여 검색속도를 향상시킨다. 장점 select절 성능을 향상(무조건은 아님) 그 결과 쿼리의 부하가 줄어서, 시스템 전체 성능 향상으로 이어짐 단점 insert,update,delete절 성능 하락 레코드(로우)가 추가,삭제,수정되면 생성된 인덱스도 동기화해주기때문 추가적인 데이터베이스 공간 필요(약 10%정도) 처음 인덱스를 생성하는데 시간이 많이 소요 인덱스의 종류 클러스터형 인덱스(Clustered Index) '영어 사전'과 같은 느낌 책의 내용 자체가 순서대로 정렬되어있어서 인덱스 자체가 책의 내용과 같은 .. 2022. 1. 31.