Database 26

24) DBMS 활용 (배치 처리 주의사항)

대용량 작업개발자 생각최대한 굵고 짧게동시에 많은 스레드로 빠르게 처리 완료중요한 쿼리들이 실행되지 못할 수 도 있다.DBA 생각가능한 가볍게 ( 가능한 짧게 )소수의 쓰레드로 최소의 DBMS자원 소모 dbms서버는 공유자원특정 서비스에서 과도한 자원 점유시, 다른 서비스의 처리 지연 유발때로는 다른 서비스의 쿼리실패 & 장애 유발DBMS 서버의 처리 용량은 다양하다. 이에 맞는 동시성 제어가 필요하다. Long TransactionIdle Transactionauto_commit = OFF 상태 또는 명시적 트랜잭션 (Begin Transaction) 사용시에Begin 이후 또는 쿼리 실행 이후 대기 상태로 남은 트랜잭션 (Commit , Rollback 실행 전)Active long transacti..

23) 테이블 파티셔닝

테이블 파티셔닝하나의 테이블을 물리적으로 여러 테이블로 분할해서 데이터를 저장하는 기법사용자는 기존처럼 하나의 테이블로 인식해서 사용 가능하다.테이블의 특정 컬럼이나 계산식을 기준으로 해서 날짜 / 숫자 범위나 리스트, 해시 형태 등으로 분할이 가능하다. 테이블 파티셔닝이 필요한 이유삭제 가능한 이력 데이터들을 효율적으로 관리할 수 있다.e.g) 로그성 데이터들이 저장되는 테이블에 파티셔닝이 적용된다.보관기간에 따라 일정기간 지난 데이터들을 제거하는 경우, 데이터 삭제가 아닌 파티션 드랍으로 처리명령문 하나로 손쉽게 처리가능하다.사용된 디스크 공간을 온전히 반환가능하다.자원 사용 효율 증가 및 쿼리 성능 향상e.g) 계시판과 같이 최근에 저장된 데이터들을 위주로 조회하는 경우날짜 범위로 파티셔닝 하여 각..

21) Join Update & Join Delete

Use Case다른 테이블의 컬럼 값을 참조해서 Update / Delete 하고 싶은 경우한 번에 여러 테이블에 대해 Update / Delete 하고 싶은 경우 Join Update첫번째 쿼리특정 회사의 상품 수수료율이 변경되었을 때 그 회사의 제품들의 가격을 update하는 쿼리다른 테이블의 컬럼 값ㅇ르 참조해서 실제 작업 대상 테이블의 데이터를 업데이트하는 경우두번째 쿼리product, order table에 상품명을 저장하려고 한다.join후에 한번의 쿼리로 상품명을 update 하였다.SET 절에 update 대상 컬럼들을 명시한다.쿼리에서 참조하고 있는 테이블들 중 "전체" 또는 "일부"에 대해 컬럼 값 업데이트가 가능하다Left Join등 다른 유형의 join들도 사용이 가능하다.쿠폰 만료..

20) Dead Lock

Deadlock원인tx1 이 pk=2 레코드에 exclusive lock (x-lock)획득tx-2,3 이 중복된 레코드에 대해서 s-lock 이 필요해서 대기tx1 commit하면 tx2,3 shared lock 동시획득tx2,3 pk=2레코드에 대해서 동시에 x-lock 획득 대기의문 사항왜 shared lock을 먼저걸고 , exclusive lock을 걸어야 하는가?insert시에 pk는 unique해야함으로 해당 record에대해서 s lock을 걸고 확인을 먼저하게 된다.어떻게 이미 삭제된 레코드에 대해서 lock을 걸수 있는가?해당 레코드들을 영구적으로 삭제하지 않고 일정시간 동안 삭제표시만 상태로 유지한다. (Deletion-mark [Tomb stone])쿼리에서만 해당 레코드가 보이지 ..

19) JSON 타입 활용

JSON 데이터 타입JSON 형식의 데이터를 손쉽게 저장 및 조회 , 관리 가능빌트인 함수들을 사용해서 JSON 데이터 조작 가능저장된 JSON 데이터의 일부만 업데이트 가능( 부분 업데이트도 가능)저장된 JSON 데이터의 특정 키에 대해서 인덱스 생성 가능  default 가 null이 아니면 instant 알고리즘으로 DDL이 불가능하다.테이블 전체를 락을 잡게되는 algorithm = Copy를 사용해야한다. 이때는 DDL작업중에는 DML이 차단된다.  JSON 데이터 저장주의할점은 객체 데이터 입력시 key에 해당하는 값은 반드시 쌍따옴표로 감싸줘야 정상적으로 값이 들어간다.insert할시에 json 형식인지 validation이 존재한다. 저장 구조최적화된 바이너리 포맷으로 저장된다.중복된 키 ..

17) NoWait & Skip Locked , 18) Union vs Union All

select for update NOWAIT잠금 대상 레코드가 이미 다른 세션에 의해 잠겨있는 경우, 잠금을 대기하는 것이 아니라 바로 에러를 반환한다.Statement aborted because locks could not be acquired immediately and NOWAIT is set.innodb_lock_wait_timeout 옵션을 0으로 설정한 것과 유사한 효과 (옵션의 기본값은 50)트랜잭션 내에서 NOWAIT 쿼리를 실행하여 에러가 반환되더라도, 열어둔 트랜잭션은 그대로 유지된다.불필요하게 잠금을 오래기다리지 않고 바로 결과를 확인하고 끝낼수 있다. select for update SKIP LOCKED잠금 대상 레코드 중에 다른 세션에 의해 이미 잠금이 걸려있는 레코드는 스킵하고..

16) Count(*) vs Count(column)

다른 column들은 14108을 반환했는데 fd1 같은 경우에는 default 가 null이어서 그중에 null이 아닌녀석을 반환해서 숫자가 줄어든 것이다.returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement인자로 null을 주면 select count(NULL) = 0 이 된다. where 조건 가진 CountCovering IndexNon Covering Index where 조건 없는 Countha_records() 스토리지 API 사용ha_index_next() 스토리지 API 사용 fd1, fd2 둘다 row 갯수는 같다. Not NULL에 상관없이 두 컬럼 모두 다 ..

15) 풀스캔 쿼리 패턴 및 튜닝

Mysql 에 index가 있음에도 불구하고 테이블 풀스캔으로 처리되는 대표적인 경우들 1. 컬럼이 가공되는 경우해당 컬럼이 인덱스에 존재하더라도 쿼리에서 인덱스를 활용하지 못한다.형변환의 예시의 경우 mysql에서는 묵시적으로 문자열 타입 컬럼에 대해 숫자 타입으로 형변환을 수행한다.함수 떄문에 인덱스를 못하는 경우 풀어서 where절에 넣어주면 동일한 요건이지만 인덱스를 사용하게 된다. 2. 인덱싱 되지 않은 컬럼을 조건절에 OR연산과 함께 사용하는 경우joined_at column이 인덱싱에 포함되지 않은 컬럼이었을때 OR연산을 수행시에 account_type이 인덱싱이 되어있더라도 쿼리 실행계획은 인덱스를 타지 못하게 된다.이후 인덱스에 joined_at column도 추가하면 정상적으로 두 co..

14) UUID 사용 주의사항

UUID VersionVersion 1,2Timestamp 기반의 UUID 생성별도의 unique 한 값 입력없이 생성 가능version 3,5name과 namespace의 MD5 또는 SHA-1 해시 기반의 UUID 생성생성시 unique한 입력을 필요로 한다.version 4완전 랜덤한 UUID 생성 Timestamp의 비트 순서가 바뀌어서 UUID에 배치된다.7.5 바이트를 쪼개서 순서를 재배열해서 만들어진다. 생성시점이 동일해도 , 정렬 순서가 일치하지는 않는다.UUID version-1의 타임스탬프는 100 나노초 단위로 1씩 증가 (각 row의 term을 말하는것이다.)위 사진은 시간대별 UUID 값이다. 7분 10여초 단위로 첫번째 파트가 리셋된는 것을 알 수 있다. UUID vs B-Tre..

13) 콜레이션

콜레이션 이란문자를 비교하거나 정렬할 때 사용되는 규칙이다.문자집합(Character Set)에 종속적문자와 코드값(코드 포인트)의 조합이 정의돼있는 것이 문자집합이다e.g) A=U+0041, B=U+0042MySQL에서 모든 문자열 타입 컬럼은 독립적인 문자집합과 콜레이션을 가질 수 있다.사용자가 특별히 지정하지 않은 경우 , 서버에 설정된 문자집합의 디폴트 콜레이션으로 자동 설정된다. MySQL 에서의 콜레이션 네이밍 컨벤션문자집합 _ 언어종속 _ UCA버전 _ 민감도문자집합 = utf8mb4, utf8mb3, latin1, euckr 등등 (해당 콜레이션이 속한 문자집합을 의미함)언어종속 = 특정언어에 대해 해당 언어에서 정의한 정렬 순서에 의해 정렬 및 비교를 수행한다. (다른 언어들에는 적용되지..