본문 바로가기

전체 글

(13)
MySQL RAND 함수의 난수 생성 원리 MySQL 서버의 RAND 함수는 시드(Seed)값이 주어지지 않은 경우 0이상 1.0 미만의 부동소수값을 반환하는 함수이다. 어떠한 경우에도 랜덤 값은 1.0 이상으로 생성되지 않는다. MySQL 서버에는 내부적으로 난수를 생성하는 과정에 난수 생성 최대값 제한(1073741823)이 존재하는데, 이 최대값으로 시드값에 모듈러 연산을 수행하고 시드값이 32비트를 넘을 경우에는 2^32 모듈러 연산을 수행한다. 시드값이 크게 주어진다해도 결국 RAND 함수는 난수 생성 최대값 제한에 영향을 받는다. 시드값이 존재하는 경우와 그렇지 않은 경우를 나누어 좀 더 자세한 계산 과정을 살펴보겠다. Seed 값이 존재하는 경우 RAND 함수내에 인자로 주어진 시드값은 난수 구조체(rand structure)에 의해..
Aurora MySQL Fragmentation Test & Online DDL 랜덤 INSERT 수행 시 페이지 분할과 병합을 최소화할 수 있는 fill factor 설정 값 확인 ​ 테스트 환경 - Aurora MySQL (t3.medium)​ 테스트 절차 1. fill factor 기본 값에서 md5(uuid())로 1,000,000건 레코드 삽입 2. fill factor를 테스트 값으로 설정 (100 95 90 85 80 75) 3. fill factor를 적용하기 위해 Optimize table (테이블 리빌드) 4. 테이블 풀스캔으로 버퍼풀에 로드된 PK 페이지 개수 확인 5. DB 서버 재시작 6. 200번 반복 a. 10,000건 레코드 삽입 b. 10,000건 레코드 삭제 7. Optimize table ​ Iteration code ▼ for i in range(..
pt-online-schema-change PK & DROP Test 테스트 목적 Before와 같은 제약조건의 테이블을 pt-osc로 After와 같이 변경할 때 이슈없는지 확인 (pt-osc 작업 수행 중에 유입되는 DML로 인해 데이터의 일관성이 깨지는지 확인) 테스트 이유 (1) PK 제약조건과 Unique 제약 조건이 동시에 존재하여 ON DUPLICATE문을 사용할 때 데드락 발생 (2) 데드락이 발생한 문제로 절차적 방식으로 코드 롤백 (절차적 방식: 중복되는 값이 존재하는지 DB에서 확인 후, 있으면 UPDATE, 없으면 INSERT) (3) 제약조건이 하나만 존재하면 (2)번과 같은 방식을 사용할 필요 없이 ON DUPLICATE문을 사용하면 됨 --> 데드락 해소 (4) 다만 온라인으로 PK를 변경해야 하기 때문에 절차적 방식에도 적용될 수 있는 시나리오..
MySQL 인덱스 스킵 스캔(Index Skip Scan)의 원리 여기저기 설명되어 있는 MySQL의 인덱스 스킵 스캔(index skip scan)을 이야기 하고자 하는 것은 아니고, 좀 더 확실한 원리를 설명하려고 글을 적어본다. 인덱스 스킵 스캔 최적화가 적용될 때 먼저 유니크한 키 값(distinct prefix)을 전부 조회해서 쿼리에 적용하는 걸까. 예를 들어 gender라는 컬럼에 유니크한 값으로 M(Male)과 F(Female)가 있다고 가정하자. (인덱스는 gender, f2 복합 인덱스) 아래 쿼리가 수행되면, 인덱스 스킵 스캔은 먼저 유니크한 키 값을 전부 조회하는 것이 아니라 첫 번째 유니크한 값을 찾는 작업부터 수행한다. SELECT gender, f2 FROM t1 WHERE f2 > 40; 첫 번째 유니크한 값을 찾는 방법은 여러가지가 있겠지..
Aurora Version & Status 터미널 대시보드 조만간 Aurora MySQL 마이너 버전 업그레이드를 앞두고 있어서 Aurora의 버전과 상태를 확인할 수 있는 터미널 대시보드를 만들었다. DB팀의 작업이 완료되어야 다음 팀에서 작업을 이어받아 진행할 수 있기에 지속적으로 DB 서버의 상태를 모니터링 할 수 있는 대시보드가 필요했다. 실시간으로 Aurora 버전 체크할 때 유용하게 사용할 수 있을 것이다. (PostgreSQL 포함) godtechwak/aurora_upgrade_check/AuroraUpgradeCheck.go package main import ( "fmt" "log" "time" "os" "strconv" "text/tabwriter" "io/ioutil" "strings" "github.com/aws/aws-sdk-go/aws..